你好这个查询曾经在Hibernate Search 4.2中工作,升级到v5后显然现在它没有拆分搜索术语:
@Indexed
public class Foo {
@DocumentId
private Integer id;
.....
}
.....
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(Foo.class).get();
org.apache.lucene.search.Query luceneQuery = qb
.keyword()
.onFields("id")
.matching("123 567")
.createQuery();
在第4版中,Hibernate Search会创建一个与示例中的2个ID匹配的查询,但是在v5中,Hibernate Search不再将“123 567”拆分为2个术语,并将整个字符串视为单个值。相同类型的查询似乎在任何其他不是DocumentId的字段上产生旧的v4行为。我已经阅读了迁移指南,但我没有看到任何关于这种行为改变的提及。你现在如何重写这个查询?
有人可以对此有所了解吗?谢谢。
答案 0 :(得分:0)
映射为 @DocumentId 的字段需要视为特例。由于它还用于在索引中删除(和更新)文档,因此必须将其视为单个关键字以避免任何歧义:不会对其应用任何分析器。
QueryBuilder DSL使用与索引管道中使用的相同的Analyzer自动预处理 matching()子句;由于 id 字段被视为单个唯一关键字,因此输入文本在这种情况下不会被分解。
要按 id 加载实体我通常建议使用传统的Hibernate Criteria,而不是使用全文查询。
如果您想使用全文查询将其与其他全文限制相结合,您可以将 id 属性映射到其他 @Field (在@DocumentId的顶部)并给它一个不同的名称,或者您可以使用 TermQuery 定位每个 id 并使用 BooleanQuery
我怀疑迁移指南中没有提到它,因为它从来没有像在v4中那样工作。它不再像旧版本那样工作的事实可能是错误修复的结果。