我使用Lucene来允许用户搜索大量文档中的单词。 Lucene似乎默认返回所有包含输入单词的文档。如何让Lucene匹配查询中的所有单词?
是否有可能改变这种行为?我知道'+'可以用来强制包含一个术语,但是我想将其作为默认操作。
理想情况下,我想要类似于Google的功能:' - '排除单词和“abc xyz”来分组单词。
只是为了澄清 我也想过在查询的所有空格中插入'+'。我只是想避免检测分组术语(括号,引号等),并可能打破查询。还有另一种方法吗?
我使用Lucene来允许用户搜索大量文档中的单词。 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");
为什么不只是preparse用户搜索输入,并在将它传递到Lucene之前使用Lucene query syntax将其调整为符合您的标准。或者,您可以创建一些关于如何使用标准语法创建特定查询的帮助文档,并让用户决定如何执行查询。
Lucene有一个广泛的查询语言,描述如下here,描述了除了+作为默认值之外的所有内容,但这是通过用+替换空格可以简单处理的东西。因此,您唯一需要做的就是定义您希望用户输入搜索查询的格式(我强烈建议遵循默认的Lucene语法),然后您可以将自己的语法转换为Lucene语法。
该行为在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");
更改“应该”到“必须”应使默认需要条款(例如字)。
像Adam说,没有必要做任何事情来查询字符串。 QueryParser的setDefaultOperator完全符合你的要求。
+1,我一直在寻找这个,很高兴我发现它在SO – mohang 2012-04-11 11:06:04