我在索引实体中有一个可为空的列,我想过滤掉在相应字段中具有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问题?)或者我使用的方式有误?
谢谢。
答案 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。