hibernate - Hibernate Search 5.11 indexNullAs不起作用

标签 hibernate elasticsearch lucene hibernate-search

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

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

我已经在indexNullAs批注中使用了Field属性,并且,如果我正确理解了文档,应在索引中将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问题?),或者我使用的方式有误?
谢谢。

最佳答案

我认为问题出在您的查询,而不是索引。 indexNullAs确实适用于LocalDate上的Elasticsearch(我只是仔细检查了一下)。

您如何建立查询?如果您使用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。

关于hibernate - Hibernate Search 5.11 indexNullAs不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54456158/

相关文章:

spring-boot - Elasticsearch高级休息客户端无法映射geo_point

performance - Lucene 内存空间索引性能不佳

java - JPA 中的哪些操作绕过持久性上下文/缓存并直接在数据库中调用?

elasticsearch - Elasticsearch 聚合组值

performance - 汇入资料时缓慢的汇总查询

mongodb - Elasticsearch-更新非索引字段

solr - 是否可以在 geodist 中使用多值字段

java - 查找两个列表中的共同元素

java - 运行 hibernate 5 时弹出 Microsoft SQL 变体类型错误

java - Spring,多个Hibernate Sessionfactories配置