16

Solr でのクエリについて質問があります。OR ですべて論理的にリンクされた複数の検索用語 (例: q=content:(foo OR bar OR foobar)) を使用してクエリを実行すると、Solr はこれらの用語のいずれかにすべて一致するドキュメントのリストを返します。しかし、Solr が返さないのは、どのドキュメントがどの用語にヒットしたかです。したがって、上記の例で知りたいのは、結果リストのどのドキュメントにfooなどの用語が含まれているかです。この情報があれば、用語とドキュメントのマトリックスを作成できます。

私の質問は、Solr に不足している情報を教えてもらうにはどうすればよいかということです。どこかにあると確信しています。そうしないと、全体としての検索が機能しません。しかし、何が欠けていますか?ご協力いただきありがとうございます。

PS: 回避策として、すべての検索語に対して単一の Solr クエリを実行しています。しかし、ご想像のとおり、検索語句の数が 50 を超える可能性があるため、パフォーマンスの問題では最悪です :(

4

3 に答える 3

16

要件によって異なりますが、私の知る限り、Solr ではこれに対する具体的なサポートはありません。ただし、他のいくつかの方法で一緒にハックできます。これらのパフォーマンスに期待できることはわかりません..

ハイライトを使う

強調表示を使用すると、返された強調表示されたスニペットを解析して、強調表示されたテキストの開始/終了タグを見つけることができます。これは、クエリ内の何かに一致した用語になります。

debugQuery 情報を使用する

(iirc)debugQuery=trueを調べることで、クエリによって返された情報を解析して、用語が結果に関連付けられているかどうかを判断できます。termWeightこれは、元の用語のフィルター処理されたバージョンである可能性があります (フィールドに対してステミングなどを有効にしている場合)。

フィールドの折りたたみを使用する

group.query を使用すると、複数のリクエストを発行する代わりに、各用語に一致するドキュメントのリストを作成できます。「いずれかを含む」のリストが必要な場合は、いくつかの用語を OR で結合したクエリを作成することもできます。大量のフィールドには効果がない場合があります。

返されたドキュメントを自分で解析する

ドキュメントを取得し、自分で用語を抽出します。Solr 側でもテキスト処理を行う必要があるため、あいまい一致が少し必要になります。

関数クエリを使用する

ドキュメント内の用語の出現回数を検索する FunctionQuery から、各用語を含む各ドキュメントのメタ値を取得できます。多数の用語に対してかなりの数の関数クエリが必要になりますが、高速になる可能性があります。

.. どちらのオプションも完璧ではありませんが、当面の問題には有効かもしれません。

于 2014-07-30T13:39:49.383 に答える
10

答えとしての私のコメント:

私は関数クエリを使用していますが、パフォーマンスは問題ではないようです:) 興味のある方へ:exists関数を使用していて、すべての検索語に so: のような疑似フィールドを追加していますfl=exists(query({!v='content:(foo)'})),exists(query({!v='content:(bar)'}))。応答から、正規表現を使用して検索語を解析します。

ポールが上で述べたように、疑似フィールドにエイリアスを設定して、正規表現の解析を回避できます。fl=foo:exists(query({!v='content:(foo)'}))

于 2014-10-02T15:11:42.240 に答える