web-dev-qa-db-ja.com

Lucene QueryParserで2つのフィールドを指定する方法は?

QueryParserに複数のフィールドを組み込む方法 を読みましたが、取得できませんでした。

現時点では、次のような非常に奇妙な構造をしています。

parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)

私は次のようなことのために何ができますか?

parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff) 

そのため、パーサーはフィールド「bodytext」およびフィールド「title」で検索ワードを探します。

62
Tyzak

これを行うには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);

2番目の方法は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);
// <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));

もう1つのオプションは、bodytextandtitleというコンテンツをインデックス化するときに新しいフィールドを作成することです。このフィールドに、bothbodytextとtitleのコンテンツを配置できます。 1つのフィールドを検索する必要があります。

148
Sam Doshi