10

MySQLでは、次のようなことができます。

  SELECT id FROM table WHERE field = 'foo' LIMIT 5

テーブルに10,000行がある場合、このクエリは、LIMIT部分を省略した場合よりもはるかに高速です。

ElasticSearchには、次のものがあります。

 {
    "query":{
       "fuzzy_like_this_field":{
          "body":{
             "like_text":"REALLY LONG (snip) TEXT HERE",
             "max_query_terms":1,
             "min_similarity":0.95,
             "ignore_tf":true
          }
       }
    }
 }

この検索を実行すると、数秒かかりますが、mysqlは同じクエリの結果をはるかに短い時間で返すことができます。

サイズパラメータ(1に設定)を渡すと、正常に返される結果は1つだけですが、クエリ自体は、サイズを無制限に設定してすべての結果を返した場合よりも高速ではありません。クエリ全体が実行されており、クエリの処理が完了した後に返される結果は1つだけだと思います。これは、「サイズ」属性が私の目的には役に立たないことを意味します。

応答を返す前にインデックス内のすべてのレコードを処理するのではなく、あいまい検索に一致する単一のレコードが見つかったらすぐに検索を停止する方法はありますか?私はこれについてもっと根本的なことを誤解していますか?

前もって感謝します。

4

1 に答える 1

9

クエリが完全に実行されているのは正しいです。デフォルトでは、クエリはスコアでソートされたデータを返すため、クエリは各ドキュメントにスコアを付けます。ドキュメントには、ファジークエリは適切にスケーリングされないと記載されているため、他のクエリを検討することをお勧めします。

制限フィルターを使用すると、探しているものと同様の動作が得られる場合があります。

制限フィルターは、実行するドキュメントの数(シャードごと)を制限します

mysqlを複製するには、用語フィルターfield='foo'を使用してみてください。スコアリングを気にしない場合は、フィルターを使用する必要があります。フィルターはより高速でキャッシュ可能です。

于 2011-12-21T03:29:57.423 に答える