Lukeでは、次の検索式は23の結果を返します。
docurl:www.siteurl.com docfile:Tomatoes*
これと同じ式を次の実装でC#Lucene.NETアプリに渡すと、次のようになります。
IndexReader reader = IndexReader.Open(indexName);
Searcher searcher = new IndexSearcher(reader);
try
{
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
BooleanQuery bquery = new BooleanQuery();
Query parsedQuery = parser.Parse(query);
bquery.Add(parsedQuery, Lucene.Net.Search.BooleanClause.Occur.MUST);
int _max = searcher.MaxDoc();
BooleanQuery.SetMaxClauseCount(Int32.MaxValue);
TopDocs hits = searcher.Search(parsedQuery, _max)
...
}
結果は0になります
LukeはStandardAnalyzerを使用しており、ExplainStructureウィンドウは次のようになります。
BooleanClause
検索するフィールドごとにオブジェクトを手動で作成し、各フィールドを指定してから、オブジェクトにShould
追加する必要がありますか?私は私のためにこれを行うだろうと思った。私は何が欠けていますか?BooleanQuery
.Add()
QueryParser
編集:
少し単純化するとdocfile:Tomatoes*
、Lukeでは23のドキュメントが返されますが、私のアプリでは0が返されます。Geneの提案により、私はからに変更しMUST
ましたSHOULD
:
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
BooleanQuery bquery = new BooleanQuery();
Query parsedQuery = parser.Parse(query);
bquery.Add(parsedQuery, Lucene.Net.Search.BooleanClause.Occur.SHOULD);
int _max = searcher.MaxDoc();
BooleanQuery.SetMaxClauseCount(Int32.MaxValue);
TopDocs hits = searcher.Search(parsedQuery, _max);
parsedQueryは単純ですdocfile:tomatoes*
Edit2:
私はついに根本的な問題に到達したと思います:
QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
Query parsedQuery = parser.Parse(query);
2行目でquery
は"docfile:Tomatoes*"
、はですが、parsedQuery
はです{docfile:tomatoes*}
。違いに気づきましたか?解析されたクエリの小文字の「t」。私はこれまで気づかなかった。IDEの値を「T」に変更すると、23件の結果が返されます。
StandardAnalyzer
インデックスを作成してインデックスを読み取るときに使用されていることを確認しました。queryParser
の値の大文字と小文字を維持するように強制するにはどうすればよいquery
ですか?
Edit3: うわー、なんてイライラする。ドキュメントによると、私はこれを次の方法で達成できます。
parser.setLowercaseExpandedTerms(false);
ワイルドカード、プレフィックス、ファジー、および範囲クエリの用語を自動的に小文字にするかどうか。デフォルトはtrueです。
それが賢明なデフォルトであるかどうかについては議論しません。SimpleAnalyzerを使用して、インデックスの内外のすべてを小文字にする必要があったと思います。イライラする部分は、少なくとも私が使用しているバージョンでは、Lukeがデフォルトで逆になっていることです。少なくとも、Luceneについてもう少し学びました。