Elasticsearch:「用語」、「マッチフレーズ」、「クエリ文字列」の違い


116

ここElasticsearchに新しく、これらのクエリの違いをよりよく理解しようとしています。私の知る限りではterm、単一の用語に一致し(一致を機能させるには小文字にする必要がありますか?)、両方match phrasequery string一致し、テキストの文字列に一致します。

回答:


226

termクエリはそのまま単一の用語に一致します。値は分析されません。そのため、インデックス付けした内容に応じて、小文字にする必要はありません。

Bennettインデックス時に提供され、値が分析されない場合、次のクエリは何も返しません。

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase クエリ対象のフィールドにアナライザーが定義されている場合、クエリは入力を分析し、次の基準に一致するドキュメントを見つけます。

  • すべての用語がフィールドに表示される必要があります
  • それらは入力値と同じ順序でなければなりません

たとえば、次のドキュメントにインデックスを付ける場合(standardフィールドにアナライザーを使用foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

このmatch_phraseクエリは、最初と2番目のドキュメントのみを返します。

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_string既定では、一度に複数のテキストフィールドのテキストを含む_allフィールドでのクエリ検索。その上、解析され、いくつかの演算子(AND / OR ...)、ワイルドカードなどをサポートします関連する構文を参照)。

match_phraseクエリとして、入力は、クエリされたフィールドに設定されたアナライザーに従って分析されます。

とは異なり、match_phraseユーザーが入力の前後に引用符を使用していない限り、分析後に取得された用語は同じ順序である必要はありません。

たとえば、前と同じドキュメントを使用すると、このクエリはすべてのドキュメントを返します。

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

ただし、このクエリはクエリと同じ2つのドキュメントを返しmatch_phraseます。

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

これらのクエリのさまざまなオプションについては、他にも言うべきことがたくさんあります。関連ドキュメントをご覧ください。

これが十分に明確であり、役立つことを願っています。


素晴らしい、素晴らしい、そして徹底的な説明!私が明確にしていない唯一のことは、分析が正確に何であるか、または何であるかです...
blee908

1
どういたしまして:)アナライザーはテキストを処理して、最終的に索引付け/検索される用語を取得します。これは理解すべき非常に重要な概念であるため、ElasticSearch Definitive Guideのこれらのページをお読みください。
ThomasC 2014

1
ええSQLから来て、ここにはたくさんの新しいアイデアがあります。クエリとフィルターの違い、正確な値と全文、JSON検索オブジェクト、エラスティック検索での検索の実行方法。とにかく取り入れたい!!! リソースをありがとう!
blee908 2014

1
@ThomasCインデックスに{"foo": "Hello beautiful world"}がある場合、クエリはこれを返しますか?
batmaci 2016

1
@batmaci matchクエリは、フィールドが分​​析されている場合はアナライザーを使用するため、はい。デフォルトでは、少なくとも1つの用語(パラメータを参照operator)を含むドキュメントが返され、順序は重要ではありません。
ThomasC 2016

17

部分的な検索に関してそれらの間の違いを間違いなく探している人がいると思います ここにデフォルトの「標準アナライザー」での私の分析があります :-

データがあるとします:-

{"名前": "こんにちは"}

次に、ellを使用して部分検索を実行する場合はどうでしょうか?

用語クエリまたは一致クエリ

{"term":{"name": "*ell*" }

動作しません、注意してください。

{"term":{"name": "*zz* *ell*" }

動作しません、注意してください。

結論 -用語または一致は部分検索をまったく実行できません

ワイルドカードクエリ:-

{"wildcard":{"name": "*ell*" }

動作し、結果{"name": "Hello"}が得られます

{"wildcard":{"name": "*zz* *ell*" }

動作しません、注意してください。

結論 -ワイルドカードは1つのトークンのみで部分検索を実行できます

クエリ文字列 :-

{"query_string": {"default_field": "name","query": "*ell*"}

動作し、結果は{"name":“ Hello”}になります

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

動作し、結果は{"name":“ Hello”}になります。

結論 -query_stringは2つのトークンを指定して検索できます

->ここでトークンはellとzzです


wildcard is able to do partial search with one token only:より正確には、wildcardクエリはデフォルトでkeyword、定義上は単一トークンであるフィールドのみ機能します。これは、フィールドの内容が複数の単語であることとは無関係です。ワイルドカードクエリでは、「ozzy hello」が一致します。
モニカとのソックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.