私たちはSolr 3.4を実行しており、比較的小さな索引数が90,000程度です。これらの文書は、複数の論理ソースに分割されており、その各検索は例えば、特定のソースに適用されるフィルタクエリを持っています:source
は、古典的な文字列フィールドであるSolr * vs *:*クエリのパフォーマンス
?q=<query>&fq=source:<source>
を。 edismaxを使用し、既定の検索フィールドのテキストを使用しています。
現在のところ、q=*
は、実行に平均で20倍の時間がかかっています(q=*:*
)。その差はかなり顕著で、*:*
は100ms、*
は3500msです。ドキュメントセット内の共通語を検索すると(すべてのドキュメントのほぼ50%にマッチする)、結果は200ms未満で返されます。 *:*
がMatchAllDocsQuery(*:*)
に解析されている間
上debugQueryとのクエリを見てみると、私たちは、*
はDisjunctionMaxQuery((text:*))
に解析されることがわかります。これは理にかなっていますが、私はそれがこの大きさの減速を説明しているとはまだ感じていません(文書の50%に一致するものに対して2000%の減速)。
この原因は何ですか?私たちが微調整できるものはありますか?
どのように他の一般的な単語を検索するよりもずっと遅いですか? 'text:foo'は、fooによってどれくらいの文書がマッチしていても、' text:* 'と比べて驚くほど高速です。確かに、フィールドを検索する:*存在すると仮定して、フィールドの内容についての実際のマッチングを忘れることができますか? –
*はすべてが一致しているため、高価です。私はLuceneについてそれほどは分かりませんが、フィールドのすべての値で*を検索しているときに、より最適化されたデータを使用して検索していると思います。ワイルドカードのパフォーマンスに言及しているhttp://lucidworks.lucidimagination.com/display/lweug/Wildcard+Queriesをお読みください。現時点で私がどこで読んだのか覚えていませんが、Solr Wikiのどこかでfield:*を使用していると言及されています:* – Fuxi
そのように見えるのは、*は正規表現の一致を*フィールドで見つかったすべての用語に適用されます。基本的に、Luceneのインデックスでは簡単に答えを出すことができないとわれわれは知っていることを質問しており、フィールド内の用語の簡潔なスキャンを実行する必要があります。 –