vb.net – 如何在QueryParser中合并多个字段?

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的时候创建一个新的字段,你可以放置文件名和文件内容内容,然后你只需要搜索一个字段。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...