web-dev-qa-db-ja.com

QueryParserに複数のフィールドを組み込む方法は?

Dim qp1 As New QueryParser("filename", New StandardAnalyzer())
Dim qp2 As New QueryParser("filetext", New StandardAnalyzer())
.
.

「Lucene.Net」ライブラリを使用していますが、次の質問があります。

2つの別々のQueryParserオブジェクトを作成し、それらを使用して2つのHitsオブジェクトを取得する代わりに、単一のQueryParserオブジェクトを使用して両方のフィールドで検索を実行し、1つのHitsオブジェクトのみを取得することは可能ですか。各ドキュメントの全体的なスコアを教えてくれますか?

34
user57175

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

2番目の方法は、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ここを参照 の特別な構文を使用することです。

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));

もう1つのオプションは、filenameandtextというコンテンツにインデックスを付けるときに新しいフィールドを作成することです。このフィールドに、both filenameとfiletextのコンテンツを配置すると、1つのフィールドを検索するだけで済みます。

77
Sam Doshi

各用語でクエリ文字列を作成するだけです。

"filename:searchText OR filetext:searchText"

QueryParserのコンストラクターの初期フィールドとして何を渡すかは重要ではありません。クエリ文字列で.Parse()を呼び出して、Queryオブジェクトを実行に戻すようにしてください。

「and」検索を使用する場合:

"+filename:searchText +filetext:searchText"
4
Bob King

** MultiFieldQueryParserを使用して、使用可能なすべてのフィールドを検索することもできます。**

例えば

Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, 
indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer)

ここに完全な例があります。

//get index directory
Dim directory As Directory = FSDirectory.Open(New DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath)))

//get analyzer
Dim analyzer As Analyzer = New StandardAnalyzer(Version.LUCENE_29)

//get index reader and searcher
Dim indexReader__1 As IndexReader = IndexReader.Open(directory, True)
Dim indexSearch As Searcher = New IndexSearcher(indexReader__1)

//add all possible fileds in multifieldqueryparser using indexreader getFieldNames method
Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer)
Dim query = queryParser.Parse(Criteria)
Dim resultDocs As TopDocs = Nothing

//perform search
resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc())
Dim hits = resultDocs.scoreDocs

その助けを願っています

2
vijay shiyani

フィールドごとに、上記のクエリパーサーからクエリを作成し、そのクエリをbooleanqueryに追加して、「必ず発生する」ことを示します。

または、MultiFieldQueryParserを確認してください。これは簡単な方法です。

1
Saltire