查询匹配多个ID?休眠搜索 5

Query matching multiple Ids? Hibernate Search 5

你好,这个查询曾经在 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();

在 v4 中,Hibernate Search 将创建与示例中的 2 个 ID 中的任何一个匹配的查询,但是在 v5 中,Hibernate Search 不再将“123 567”拆分为 2 个词并将整个字符串视为单个值.相同类型的查询似乎在不是 DocumentId 的任何其他字段上产生旧的 v4 行为。我已经阅读了迁移指南,但没有看到任何关于这种行为变化的提及。您现在将如何重写此查询?

有人可以解释一下吗?谢谢。

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

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

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

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

组合所有术语查询

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