如何在QueryParser中包含多个字段?

Dim qp1 As New QueryParser("filename", New StandardAnalyzer()) Dim qp2 As New QueryParser("filetext", New StandardAnalyzer()) . . 

我正在使用“Lucene.Net”库,并有以下问题。

而不是创build两个单独的QueryParser对象,并使用它们来获取两个Hits对象,是否可以使用单个QueryParser对象在两个字段上执行search,以便我只有一个Hits对象,它可以给我每个Document的总体分数?

有3种方法可以做到这一点。

第一种方法是手动构build查询,这是QueryParser在内部执行的操作。 这是实现它的最有效的方法,并且意味着如果要防止访问QueryParser一些更奇特的function,则不必parsing用户input:

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

第二种方法是使用MultiFieldQueryParser ,它的行为类似于QueryParser ,允许访问它拥有的所有权力,除了它将search多个字段。

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

最后的方法是使用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)); 

你的另一个select是当你创build一个名为filename和text的内容时,创build一个新的字段,你可以在其中放置filename和filetext的内容,然后你只需要search一个字段。

只要build立一个查询string与每个术语:

 "filename:searchText OR filetext:searchText" 

在QueryParser的构造函数中作为初始字段传递的内容无关紧要。 只要确保在查询string上调用.Parse()以获取Query对象执行即可。

如果你想使用“和”search:

 "+filename:searchText +filetext:searchText" 

**您也可以使用MultiFieldQueryParser来search所有可用的字段。**

例如

 Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer) 

这里是一个完整的例子。

 //get index directory Dim directory As Directory = FSDirectory.Open(New DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath))) //get analyzer Dim analyzer As Analyzer = New StandardAnalyzer(Version.LUCENE_29) //get index reader and searcher Dim indexReader__1 As IndexReader = IndexReader.Open(directory, True) Dim indexSearch As Searcher = New IndexSearcher(indexReader__1) //add all possible fileds in multifieldqueryparser using indexreader getFieldNames method Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer) Dim query = queryParser.Parse(Criteria) Dim resultDocs As TopDocs = Nothing //perform search resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc()) Dim hits = resultDocs.scoreDocs 

希望有所帮助

对于每个字段,从上面的查询分析器创build一个查询,然后将查询添加到一个布尔型查询中,声明它是“必须”发生的。

或者,查看MultiFieldQueryParser,这是一个简化的方法。