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

如何使Lucene匹配查询中的所有单词?,lucene,search,Lucene,Search,我使用Lucene允许用户在大量文档中搜索单词。Lucene似乎默认返回包含输入的任何单词的所有文档 有可能改变这种行为吗?我知道可以使用“+”强制包含一个术语,但我想将其作为默认操作 理想情况下,我希望类似于谷歌的功能:“-”来排除单词,而“abc xyz”来分组单词 只是澄清一下 我还考虑在查询中的所有空格中插入“+”。我只是想避免检测分组的术语(括号、引号等)并可能破坏查询。还有其他方法吗?为什么不只是用户搜索输入,并在将其传递给Lucene之前使用。或者,您可以创建一些帮助文档,介绍如何

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

有可能改变这种行为吗?我知道可以使用“+”强制包含一个术语,但我想将其作为默认操作

理想情况下,我希望类似于谷歌的功能:“-”来排除单词,而“abc xyz”来分组单词

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

为什么不只是用户搜索输入,并在将其传递给Lucene之前使用。或者,您可以创建一些帮助文档,介绍如何使用标准语法创建特定的查询,并让用户决定如何执行查询。

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

该行为是硬编码的,因此更改该行为的唯一方法(除上述解决方法外)是更改该方法。该方法的结尾如下所示:

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");
将“应该”更改为“必须”应使默认情况下需要子句(例如单词)。

这看起来与问题类似。如果您感兴趣,我就是这样回答这个问题的:

String defaultField = ...;
Analyzer analyzer = ...;
QueryParser queryParser = new QueryParser(defaultField, analyzer);

queryParser.setDefaultOperator(QueryParser.Operator.AND);

Query query = queryParser.parse("Searching is fun");

如前所述,无需对查询字符串执行任何操作。QueryParser的操作完全符合您的要求。

+1,我一直在寻找这个,很高兴我在中找到了它