如何在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,这是一个简化的方法。