有三种方法可以实现这个。
第一种方法是手动构建查询,这就是QueryParser
内部所做的。这是最强大的方法,意味着如果你想防止访问一些更奇特的QueryParser
功能,你不必解析用户输入:
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("bodytext", "<text>"));
Query query2 = new TermQuery(new Term("title", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
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[] {"bodytext", "title"},
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);
string special = "bodytext:" + text + " OR title:" + text;
Hits hits = searcher.Search(queryParser.parse(special));
您的另一种选择是在索引内容时创建一个名为bodytextandtitle的新字段,将bodytext和title的内容放入其中,然后您只需要搜索一个字段。