Hibernate Search 5.11 indexNullAs 不起作用

Hibernate Search 5.11 indexNullAs does not work

我的索引实体中有一个可为空的列,我想过滤掉相应字段中具有 null 的实体。我正在使用 Elasticsearch 作为索引管理器。

@Field(analyze = Analyze.NO, indexNullAs = "2999-12-31")
@Column(name = "nullable_date")
private LocalDate nullableDate;

我在 Field 注释中使用了 indexNullAs 属性,如果我正确理解文档,null 值应该替换为索引中的 "2999-12-31" 值。 但是在 Elasticsearch 中,这个字段有一个实际的 null 值,而不是我在注释中指定的 "2999-12-31" 字符串:

"nullableDate": null,

这个字段在根索引实体中(不是 IndexedEmbedded 实体,所以不是这个问题 https://hibernate.atlassian.net/browse/HSEARCH-2389)。

我尝试了 +nullableDate:null 之类的查询并将其发送到 createFullTextQuery 方法,但我从 Elasticsearch 收到 failed to parse date field [null] with format [strict_date||yyyyyyyyy-MM-dd] 错误。我也尝试过像 +nullableDate:2999-12-31 这样的查询,显然我得到的结果是空的(因为字段在 Elastic 中有 null 值)。

这是否意味着 indexNullAs 不能正常工作(是 https://hibernate.atlassian.net/browse/HSEARCH-3099 的问题?)还是我用错了? 谢谢。

我认为问题出在您的查询上,而不是索引上。 indexNullAsElasticsearch 上对 LocalDate 有效(我刚刚仔细检查过)。

您如何构建查询?如果您使用 indexNullAs,您可能应该使用我们的 DSL。

无论如何,这有效:

        QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( MyEntity.class ).get();
        Query luceneQuery = queryBuilder.keyword()
                .onField( "nullableDate" )
                .matching( LocalDate.of( 2999, Month.DECEMBER, 31 ) )
                .createQuery();
        result = session.createFullTextQuery( luceneQuery, MyEntity.class ).list();

还有这个:

        QueryBuilder queryBuilder = session.getSearchFactory().buildQueryBuilder().forEntity( MyEntity.class ).get();
        Query luceneQuery = queryBuilder.keyword()
                .onField( "nullableDate" )
                .matching( null )
                .createQuery();
        result = session.createFullTextQuery( luceneQuery, MyEntity.class ).list();

Hibernate Search 正在发送 "null" 这一事实是意料之中的,并且实际上是一项功能:它允许在使用投影时正确检索 null。至于索引,由 Hibernate Search 生成并推送到 Elasticsearch 的 Elasticsearch 映射(即模式)应包括如下内容:

properties: {
    ...

    "nullableDate": {
        "type": "date",
        "format": "yyyyyyyyy-MM-dd",
        "null_value": "2999-12-31"

    }

    ...

}

null_value 部分表示每当 Elasticsearch 收到空值时,它会将其索引为“2999-12-31”。这正是您想要的。

附带说明一下,HSEARCH-3099 只是提醒我们在 Hibernate Search 6 中添加此功能的任务;它根本不影响 5.11。