如何让Lucene匹配查询中的所有单词?

时间:2009-01-16 14:29:05

标签: lucene search

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

是否可以改变这种行为?我知道'+'可以用来强制包含一个术语,但我想把它作为默认动作。

理想情况下,我希望功能与Google类似:' - '排除单词,将“abc xyz”排除在单词组之外。

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

5 个答案:

答案 0 :(得分:29)

这与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 :(得分:2)

就像Adam所说的那样,没有必要对查询字符串做任何事情。 QueryParser的setDefaultOperator完全符合您的要求。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

行为在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");

将“应该”改为“必须”应该默认需要条款(例如单词)。