我的索引实体中有一个可为空的列,我想过滤掉在相应字段中具有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/