2009-01-16 107 views
12

我使用Lucene来允许用户搜索大量文档中的单词。 Lucene似乎默认返回所有包含输入单词的文档。如何让Lucene匹配查询中的所有单词?

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

理想情况下,我想要类似于Google的功能:' - '排除单词和“abc xyz”来分组单词。

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

回答

27

这看起来类似于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"); 
+0

+1,我一直在寻找这个,很高兴我发现它在SO – mohang 2012-04-11 11:06:04

0

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

0

Lucene有一个广泛的查询语言,描述如下here,描述了除了+作为默认值之外的所有内容,但这是通过用+替换空格可以简单处理的东西。因此,您唯一需要做的就是定义您希望用户输入搜索查询的格式(我强烈建议遵循默认的Lucene语法),然后您可以将自己的语法转换为Lucene语法。

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"); 

更改“应该”到“必须”应使默认需要条款(例如字)。

相关问题