【问题标题】:Query matching multiple Ids? Hibernate Search 5查询匹配多个ID?休眠搜索 5
【发布时间】:2017-05-09 17:35:07
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 您好,感谢您的澄清。我深入研究了代码,它确实与您所说的相符。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多