我使用Lucene允许用户搜索大量文档中的单词。 Lucene似乎默认返回包含任何输入单词的所有文档。
是否可以改变这种行为?我知道'+'可以用来强制包含一个术语,但我想把它作为默认动作。
理想情况下,我希望功能与Google类似:' - '排除单词,将“abc xyz”排除在单词组之外。
只是为了澄清 我还想过在查询的所有空格中插入'+'。我只是想避免检测分组的术语(括号,引号等)并可能破坏查询。还有另一种方法吗?
答案 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");
将“应该”改为“必须”应该默认需要条款(例如单词)。