我正在使用 Lucene 允许用户在大量文档中搜索单词。Lucene 似乎默认返回包含输入的任何单词的所有文档。
是否有可能改变这种行为?我知道“+”可用于强制包含一个术语,但我想将其设为默认操作。
理想情况下,我希望类似于 Google 的功能:“-”排除单词,“abc xyz”对单词进行分组。
只是为了澄清 我还想过在查询中的所有空格中插入“+”。我只是想避免检测分组术语(括号、引号等)并可能破坏查询。还有另一种方法吗?
这看起来类似于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");
就像亚当说的那样,不需要对查询字符串做任何事情。QueryParser 的setDefaultOperator完全符合您的要求。
为什么不直接解析用户搜索输入并使用Lucene 查询语法对其进行调整以适应您的条件,然后再将其传递给 Lucene。或者,您可以创建一些关于如何使用标准语法创建特定查询的帮助文档,并让用户决定应该如何执行查询。
Lucene 有一个广泛的查询语言,如这里所述,它描述了您想要的所有内容,除了 + 是默认值,但您可以通过将空格替换为 + 来简单处理。因此,您唯一需要做的就是定义您希望人们输入搜索查询的格式(我强烈建议您遵守默认的 Lucene 语法),然后您可以编写从您自己的语法到 Lucene 语法的转换。
该行为在类 org.apache.lucene.queryParser.QueryParser的方法 addClause(List, int, int, Query) 中被硬编码,因此更改行为的唯一方法(除了上述解决方法)是更改该方法. 该方法的结尾如下所示:
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”应该使子句(例如单词)默认需要。