Hibernate Search 5.11 indexNullAs不起作用

时间:2019-01-31 08:22:46

标签: 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问题?)或者我使用的方式有误? 谢谢。

1 个答案:

答案 0 :(得分:0)

我认为问题出在您的查询,而不是索引。 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。