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 的问题?)还是我用错了?
谢谢。
我认为问题出在您的查询上,而不是索引上。 indexNullAs
在 Elasticsearch
上对 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。
我的索引实体中有一个可为空的列,我想过滤掉相应字段中具有 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 的问题?)还是我用错了?
谢谢。
我认为问题出在您的查询上,而不是索引上。 indexNullAs
在 Elasticsearch
上对 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。