Dim qp1 As New QueryParser("filename",New StandardAnalyzer()) Dim qp2 As New QueryParser("filetext",New StandardAnalyzer()) . .
我使用’Lucene.Net’库并有以下问题。
不是创建两个单独的QueryParser对象,并使用它们来获取两个Hits对象,是否可以使用单个QueryParser对象在两个字段上执行搜索,以便我只有一个Hits对象,它给我的每个文档的总分?
有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);
第二种方法是使用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>"));
最后的方法是使用QueryParser see here的特殊语法。
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));
你的另一个选项是在你的内容名为filenameandtext的时候创建一个新的字段,你可以放置文件名和文件内容的内容,然后你只需要搜索一个字段。