【问题标题】:combine queries in hibernate search在休眠搜索中组合查询
【发布时间】:2013-07-06 08:03:55
【问题描述】:

在 Hibernate Search (lucene) 中是否有可能组合两个不同的查询。例如,当我想搜索 2 个应该具有一个对应匹配值的字段时:

firstname - John
lastname - Doe

qBuilder.keyword().onField("firstname").matching("John").createQuery());
qBuilder.keyword().onField("lastname").matching("Doe").createQuery());

是一种从这个查询中进行的方法吗?

【问题讨论】:

    标签: hibernate lucene hibernate-search


    【解决方案1】:

    注意:这行得通,但对于更多的 Hibernate-esque 方法,请参阅我的其他答案

    createQuery() 返回一个标准的 Lucene Query。因此,在 Lucene 中合并两个查询的典型方法是使用 BooleanQuery

    Query query1 = qBuilder.keyword().onField("firstname").matching("John").createQuery();
    Query query2 = qBuilder.keyword().onField("lastname").matching("Doe").createQuery();
    BooleanQuery bq = new BooleanQuery();
    //Assuming you want to require a match on both first and last names.
    //If a match on either is enough, use BooleanClause.Occur.SHOULD
    bq.add(new BooleanClause(query1, BooleanClause.Occur.MUST));
    bq.add(new BooleanClause(query2, BooleanClause.Occur.MUST));
    

    【讨论】:

      【解决方案2】:

      与其直接使用 Lucene BooleanQuery,不如使用 Hibernate bool() 查询(参见documentation here 的第 5.1.2.6 节):

      Query query = qBuilder.bool()
          .must(qBuilder.keyword().onField("firstname").matching("John").createQuery())
          .must(qBuilder.keyword().onField("lastname").matching("Doe").createQuery())
          .createQuery();
      

      【讨论】:

      • 非常感谢。如果值“firstname”或“lastname”为空(在用户只搜索“John”,而不提供“Doe”的情况下)怎么办?我们是否能够使用类似的查询,而不必先检查空值。这是针对我们有很多可选搜索参数的场景。
      • @MichaelCleverly - 如果子句应该是可选的,只需将它们添加到 .should 而不是 .must
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多