【问题标题】:How to make Lucene match all words in query?如何使 Lucene 匹配查询中的所有单词?
【发布时间】:2010-10-01 19:43:18
【问题描述】:

我正在使用 Lucene 允许用户在大量文档中搜索单词。 Lucene 似乎默认返回包含输入的任何单词的所有文档。

是否可以改变这种行为?我知道“+”可用于强制包含一个术语,但我想将其设为默认操作。

理想情况下,我想要类似于 Google 的功能:“-”排除单词,“abc xyz”对单词进行分组。

只是为了澄清 我还想过在查询中的所有空格中插入“+”。我只是想避免检测分组术语(括号、引号等)并可能破坏查询。还有其他方法吗?

【问题讨论】:

    标签: lucene search


    【解决方案1】:

    这看起来类似于Lucene Sentence Search 问题。如果你有兴趣,我是这样回答这个问题的:

    String defaultField = ...;
    Analyzer analyzer = ...;
    QueryParser queryParser = new QueryParser(defaultField, analyzer);
    
    queryParser.setDefaultOperator(QueryParser.Operator.AND);
    
    Query query = queryParser.parse("Searching is fun");
    

    【讨论】:

    • +1,我一直在寻找这个,很高兴我在 SO 中找到它
    【解决方案2】:

    就像Adam 所说,不需要对查询字符串做任何事情。 QueryParser 的 setDefaultOperator 完全符合您的要求。

    【讨论】:

      【解决方案3】:

      为什么不只是preparse 用户搜索输入并使用Lucene query syntax 调整它以适合您的条件,然后再将其传递给Lucene。或者,您可以创建一些关于如何使用标准语法创建特定查询的帮助文档,并让用户决定应该如何执行查询。

      【讨论】:

        【解决方案4】:

        Lucene 有一个广泛的查询语言,如here 所述,它描述了您想要的所有内容,除了 + 是默认值,但您可以通过将空格替换为 + 来简单处理。因此,您唯一需要做的就是定义您希望人们输入搜索查询的格式(我强烈建议您遵守默认的 Lucene 语法),然后您可以编写从您自己的语法到 Lucene 语法的转换。

        【讨论】:

          【解决方案5】:

          该行为在method addClause(List, int, int, Query) of class org.apache.lucene.queryParser.QueryParser 中进行了硬编码,因此更改该行为的唯一方法(上述解决方法除外)是更改该方法。方法的结尾是这样的:

          if (required && !prohibited)
            clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST));
          else if (!required && !prohibited)
            clauses.addElement(new BooleanClause(q, BooleanClause.Occur.SHOULD));
          else if (!required && prohibited)
            clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST_NOT));
          else
            throw new RuntimeException("Clause cannot be both required and prohibited");
          

          将“SHOULD”更改为“MUST”应该使子句(例如单词)默认需要。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-07
            • 1970-01-01
            • 1970-01-01
            • 2015-12-11
            • 2021-06-13
            • 2011-02-07
            • 1970-01-01
            相关资源
            最近更新 更多