【问题标题】:Lucene BooleanQuery - Must be present in one of two columnsLucene BooleanQuery - 必须出现在两列之一中
【发布时间】:2015-09-14 16:10:12
【问题描述】:

不确定如何在 Lucene 中格式化查询。场景是搜索词必须出现在两列之一中(任何一个都可以)。

boolQuery.Add(query1, Occur.MUST)  'this one is fine
boolQuery.Add(query2, Occur.SHOULD)
boolQuery.Add(query3, Occur.SHOULD)

即使搜索词在第 2 列和第 3 列中根本不存在,也会显示结果。

boolQuery.Add(query2, Occur.MUST)
boolQuery.Add(query3, Occur.SHOULD)

当搜索词出现在第 3 列但不在第 2 列时,不显示结果。

如何格式化查询,以便获得等效的:

where  column 1= val1 and (column 2 = val2 or column 3 = val2)

【问题讨论】:

    标签: azure lucene indexing


    【解决方案1】:

    MUST,顾名思义,强制出现。应该意味着可选。第一个布尔查询基本上只匹配第一个子句命中的文档,但是如果它们中的任何一个可以被第二个或第三个子句命中,它们的得分就会更高。为了使结果与您想要的 linq (我假设就是这样)语句相匹配,这应该可以工作(使用 java)。

    BooleanQuery q = new BooleanQuery();
    
    BooleanQuery subQuery = new BooleanQuery();
    subQuery.addClause(new BooleanClause(q2,Occur.SHOULD));
    subQuery.addClause(new BooleanClause(q3,Occur.SHOULD));
    
    q.addClause(new BooleanClause(q1, Occur.MUST));
    q.addClause(new BooleanClause(subQuery,Occur.MUST));
    

    您的困惑可能源于查询 API 实现 must 和 should 作为一元运算符,而在传统编程语言中 ANDOR 是二元运算符

    【讨论】:

      【解决方案2】:

      我使用查询语法解决了类似的问题:

      +(col1:{query} OR col2:{query})
      

      这将返回至少在其中一个字段中具有值 {query} 的文档。

      (注意:我使用的是 QueryMultiFieldQueryParser 类)

      【讨论】:

        猜你喜欢
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        • 2016-06-26
        • 2016-05-26
        • 1970-01-01
        相关资源
        最近更新 更多