use*_*175 34 vb.net lucene lucene.net
Dim qp1 As New QueryParser("filename", New StandardAnalyzer())
Dim qp2 As New QueryParser("filetext", New StandardAnalyzer())
.
.
Run Code Online (Sandbox Code Playgroud)
我正在使用'Lucene.Net'库并提出以下问题.
不是创建两个单独的QueryParser对象并使用它们来获取两个Hits对象,而是可以使用单个QueryParser对象在两个字段上执行搜索,这样我只有一个Hits对象,它给出了每个Document的总分数?
Sam*_*shi 77
有3种方法可以做到这一点.
第一种方法是手动构建查询,这就是QueryParser内部执行的操作.这是最强大的方法,并且意味着如果您想要阻止访问以下某些更奇特的功能,则不必解析用户输入QueryParser:
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("filename", "<text>"));
Query query2 = new TermQuery(new Term("filetext", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);
Run Code Online (Sandbox Code Playgroud)
第二种方法是使用MultiFieldQueryParser,这种行为类似QueryParser,允许访问它拥有的所有权力,除了它将搜索多个字段.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
new string[] {"filename", "filetext"},
analyzer);
Hits hits = searcher.Search(queryParser.parse("<text>"));
Run Code Online (Sandbox Code Playgroud)
最后一种方法是使用特殊语法,QueryParser 请参见此处.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't
// prefix it with a field.
string special = "filename:" + text + " OR filetext:" + text;
Hits hits = searcher.Search(queryParser.parse(special));
Run Code Online (Sandbox Code Playgroud)
您的另一种选择是创建新的领域,当你索引你的内容称为filenameandtext,可以在其中放置的内容既文件名和FILETEXT,那么你只需要搜索一个领域.
对于每个字段,从上面的查询解析器创建一个查询,然后将该查询添加到一个布尔查询中,声明它“必须”发生。
或者,查看 MultiFieldQueryParser,这是一种简化的方法。