4

ES クエリを作成するためのガイドはありますか? 何をすべきか、何を避けるべきか、この種のものです。公式サイトにはさまざまな検索方法がすべて説明されていますが、いつ何を選択するかについてはほとんど説明されていません。

私の特定の例では、プロバイダーのリストがあり、それぞれに名前、アドレス、および多数の ID があります。ユーザーがプロバイダーについて知っていることを入力して、提供されたものに基づいて検索を実行できるボックスをユーザーに提供したいと考えています。基本的に、ボックスのすべての単語をインデックス内のレコード (ドキュメント) と照合したいと考えています。

エンド ユーザーにとって、これは単純なキーワード検索のように見えるはずです。

一致は、完全一致、ワイルドカード一致、音声一致、類義語 (名前の場合) をカバーする必要があります。また、多少のぼやけも含まれている必要があります。

公式サイトにはその方法がいろいろ書かれていますが、それらを組み合わせるにはどうすればよいのでしょうか。たとえば、ワイルド カード検索をサポートするには、ワイルド カード クエリを使用しますか? それとも NGram でインデックスを作成し、テキスト クエリのみを実行しますか?

SQL クエリでこの種の情報を取得する特定の方法は、クエリの実行計画を確認することです。SQL オプティマイザーが、かなりのサイズのテーブルに対してテーブル スキャンを使用することを通知した場合、クエリを変更するか、場合によってはインデックスを追加する必要があることがわかります。私の知る限り、ES にはこの強力な機能に相当するものはなく、それを構築できるかどうかさえわかりません。

しかし、少なくともいくつかの一般的な考慮事項...? かなりください...

4

2 に答える 2

2

多くの場合、インデックスを作成する内容や、データを Elasticsearch 内の変数にマッピングする方法に依存するため、物事を行うための最善の方法はありません。

あなたが注意すべきいくつかの経験則:

を。Elasticsearch のファセット クエリは順番に機能します。

{   
 "query": {
   // data will be searched from this block first //
 }, "facets": {
   // after the data is received, it will be processed into facets //
 }
}

したがって、クエリのサイズが大きい場合、ファセットによってクエリの速度がさらに低下します。クエリの結果を監視します。

b. フィルターとクエリ

フィルターはクエリのサブセットを実行します。つまり、クエリの結果全体を取得し、必要なものまたは不要なものを除外します。

クエリは通常、データの直接検索です。

したがって、フィルターを実行する前にクエリをできるだけ具体的にすることができれば、より迅速な結果が得られるはずです。

c. クエリはキャッシュされます。それらを何度も実行すると、通常は応答が速くなります。常に同じクエリ セットを使用する場合、Warmers APIを使用すると、クエリをさらに高速化できるはずです。

繰り返しますが、これらはすべて経験則であり、特定の変数にインデックスを付けると処理時間に影響するため、厳密に従うことはできません。文字列は long 型とは異なり、アナライザーを含む文字列は非アナライザーとは異なります。あなたがしなければならないことは、より良い判断を得るために、おそらくクエリを試してみることです.

于 2013-01-26T05:45:32.193 に答える
0

上記からの 1 つの修正 - フィルターは ES によってキャッシュ可能であり、クエリではありません。クエリは、関連性スコアリングと全文検索の追加ステップを実行します。そのため、フィルターを使用して全文検索を行う必要がない場合は、これをお勧めします。

また、正しいインデックス値 (not_analyzed、no、analyized) を使用してマッピングを設計します。

于 2014-11-04T08:53:30.987 に答える