为了允许用户使用Lucene 3.5搜索多个字段,我当前为每个要搜索的字段创建并添加QueryParser到DisjunctionMaxQuery.当使用OR作为默认运算符时,这很有用,但我现在想将默认运算符更改为AND以获得更准确(和更少)的结果.
问题是,queryParser.setDefaultOperator(QueryParser.AND_OPERATOR)错过了很多文档,因为所有术语都必须在至少1个字段中.
例如,考虑文档的以下数据:title field ="Programming Languages",body field ="Java,C++,PHP".如果用户要搜索Java编程,则该特定文档将不会包含在结果中,因为标题和正文字段包含查询中的所有术语,尽管它们组合在一起.我希望为上述查询返回此文档,但不希望查询HTML编程.
我考虑过一个笼罩的领域,但我遇到了一些问题.首先,用户经常在他们的查询(作者:账单)中包括每个字段术语,这对于一个catchall字段是不可能的.此外,我使用FastVectorHighlighter突出显示某些字段,要求对它们进行索引和存储.因此,通过添加一个catchall字段,我必须将大多数相同的数据索引两次,这是耗费时间和空间的.
有任何想法吗?
我猜我应该做更多的研究.事实证明,MultiFieldQueryParser提供了我正在寻找的确切功能.无论出于何种原因,我为每个要搜索的字段创建了一个QueryParser,如下所示:
String[] fields = {"title", "body", "subject", "author"};
QueryParser[] parsers = new QueryParser[fields.length];
for(int i = 0; i < parsers.length; i++)
{
parsers[i] = new QueryParser(Version.LUCENE_35, fields[i], analyzer);
parsers[i].setDefaultOperator(QueryParser.AND_OPERATOR);
}
Run Code Online (Sandbox Code Playgroud)
这将导致这样的查询:
(+title:java +title:programming) | (+body:java +body:programming)
Run Code Online (Sandbox Code Playgroud)
......这不是我所期待的.现在我创建一个这样的MultiFieldQueryParser:
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_35, new String[]{"title", "body", "subject"}, analyzer);
parser.setDefaultOperator(QueryParser.AND_OPERATOR);
Run Code Online (Sandbox Code Playgroud)
这给了我正在寻找的查询:
+(title:java body:java) +(title:programming body:programming)
Run Code Online (Sandbox Code Playgroud)
感谢@seeta和@femtoRgon的帮助!
| 归档时间: |
|
| 查看次数: |
3119 次 |
| 最近记录: |