如何在Lucene QueryParser中指定两个字段?

Tyz*_*zak 63 parsing lucene.net field

我阅读了如何在QueryParser中合并多个字段?但我没有得到它.

目前我有一个非常奇怪的结构,如:

parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)
Run Code Online (Sandbox Code Playgroud)

我能做些什么:

parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff) 
Run Code Online (Sandbox Code Playgroud)

因此,Parser在字段"title"中的"bodytext"字段中查找搜索单词.

Sam*_*shi 150

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

第一种方法是手动构建查询,这就是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);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用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>"));
Run Code Online (Sandbox Code Playgroud)

最后一种方法是使用特殊语法,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 = "bodytext:" + text + " OR title:" + text;

Hits hits = searcher.Search(queryParser.parse(special));
Run Code Online (Sandbox Code Playgroud)

您的另一种选择是创建新的领域,当你索引你的内容称为bodytextandtitle,可以在其中放置的内容 bodyText的和标题,那么你只需要搜索一个领域.