查询匹配多个ID? Hibernate Search 5

时间:2017-05-09 17:35:08

标签: java hibernate lucene hibernate-search

你好这个查询曾经在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行为。我已经阅读了迁移指南,但我没有看到任何关于这种行为改变的提及。你现在如何重写这个查询?

有人可以对此有所了解吗?谢谢。

1 个答案:

答案 0 :(得分:0)

映射为 @DocumentId 的字段需要视为特例。由于它还用于在索引中删除(和更新)文档,因此必须将其视为单个关键字以避免任何歧义:不会对其应用任何分析器。

QueryBuilder DSL使用与索引管道中使用的相同的Analyzer自动预处理 matching()子句;由于 id 字段被视为单个唯一关键字,因此输入文本在这种情况下不会被分解。

要按 id 加载实体我通常建议使用传统的Hibernate Criteria,而不是使用全文查询。

如果您想使用全文查询将其与其他全文限制相结合,您可以将 id 属性映射到其他 @Field (在@DocumentId的顶部)并给它一个不同的名称,或者您可以使用 TermQuery 定位每个 id 并使用 BooleanQuery

我怀疑迁移指南中没有提到它,因为它从来没有像在v4中那样工作。它不再像旧版本那样工作的事实可能是错误修复的结果。