クエリ文字列クエリ

このページには、query_stringクエリタイプに関する情報が含まれています。Elasticsearchで検索クエリを実行する方法については、検索APIを参照してください。

厳密な構文を持つパーサーを使用して、提供されたクエリ文字列に基づいてドキュメントを返します。

このクエリは、ANDNOTなどの演算子に基づいて提供されたクエリ文字列を解析し、分割するための構文を使用します。クエリは、マッチするドキュメントを返す前に、各分割されたテキストを独立して分析します。

  1. 無効な構文に対してエラーを返すため、`````query_string`````クエリを検索ボックスで使用することはお勧めしません。
  2. クエリ構文をサポートする必要がない場合は、[`````match`````](/read/elasticsearch-8-15/6701b8226a9afe3f.md)クエリの使用を検討してください。クエリ構文の機能が必要な場合は、[`````simple_query_string`````](/read/elasticsearch-8-15/2579748a29ddaa31.md)クエリを使用してください。これは、より厳密ではありません。
  3. ## 例リクエスト
  4. 次の検索を実行すると、`````query_string`````クエリは`````(new york
  5. city) OR (big apple)``````````new york city``````````big apple`````2つの部分に分割します。`````content`````フィールドのアナライザーは、マッチするドキュメントを返す前に、各部分をトークンに独立して変換します。クエリ構文は空白を演算子として使用しないため、`````new york city`````はそのままアナライザーに渡されます。
  6. #### Python
  7. ``````python
  8. resp = client.search(
  9. query={
  10. "query_string": {
  11. "query": "(new york city) OR (big apple)",
  12. "default_field": "content"
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. query: '(new york city) OR (big apple)',
  6. default_field: 'content'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "query": "(new york city) OR (big apple)",
  6. "default_field": "content"
  7. }
  8. }
  9. }`)),
  10. es.Search.WithPretty(),
  11. )
  12. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. query: "(new york city) OR (big apple)",
  5. default_field: "content",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "(new york city) OR (big apple)",
  6. "default_field": "content"
  7. }
  8. }
  9. }

query_stringのトップレベルパラメータ

  • query
  • (必須、文字列) 解析して検索に使用するクエリ文字列。 クエリ文字列構文を参照してください。
  • default_field
  • (オプション、文字列) クエリ文字列にフィールドが指定されていない場合に検索するデフォルトフィールド。 ワイルドカード(*)をサポートします。
    デフォルトは、index.query.default_fieldインデックス設定で、デフォルト値は*です。 *値は、用語クエリに適格なすべてのフィールドを抽出し、メタデータフィールドをフィルタリングします。抽出されたすべてのフィールドは、prefixが指定されていない場合にクエリを構築するために組み合わされます。
    すべての適格フィールドを横断して検索することは、ネストされたドキュメントを含みません。これらのドキュメントを検索するには、nestedクエリを使用してください。
    フィールド数が多いマッピングでは、すべての適格フィールドを横断して検索することは高コストになる可能性があります。
    一度にクエリできるフィールド数と用語の数には制限があります。これは、indices.query.bool.max_clause_count 検索設定によって定義されています。
  • allow_leading_wildcard
  • (オプション、ブール値) trueの場合、ワイルドカード文字*?はクエリ文字列の最初の文字として許可されます。デフォルトはtrueです。
  • analyze_wildcard
  • (オプション、ブール値) trueの場合、クエリはクエリ文字列内のワイルドカード用語を分析しようとします。デフォルトはfalseです。
  • analyzer
  • (オプション、文字列) アナライザーを使用して、クエリ文字列内のテキストをトークンに変換します。デフォルトは、default_fieldにマッピングされたインデックス時アナライザーです。アナライザーがマッピングされていない場合、インデックスのデフォルトアナライザーが使用されます。
  • auto_generate_synonyms_phrase_query
  • (オプション、ブール値) trueの場合、マッチフレーズクエリが自動的に作成されます。デフォルトはtrueです。 同義語とquery_stringクエリの例を参照してください。
  • boost
  • (オプション、浮動小数点) クエリの関連スコアを減少または増加させるために使用される浮動小数点数。デフォルトは1.0です。ブースト値は1.0のデフォルト値に対して相対的です。 01.0の間のブースト値は関連スコアを減少させます。 1.0より大きい値は関連スコアを増加させます。
  • default_operator
  • (オプション、文字列) 演算子が指定されていない場合にクエリ文字列内のテキストを解釈するために使用されるデフォルトのブール論理。 有効な値は次のとおりです:
    • OR (デフォルト)
    • たとえば、capital of Hungaryのクエリ文字列はcapital OR of OR Hungaryとして解釈されます。
    • AND
    • たとえば、capital of Hungaryのクエリ文字列はcapital AND of AND Hungaryとして解釈されます。
  • enable_position_increments
  • (オプション、ブール値) trueの場合、query_string検索から構築されたクエリで位置のインクリメントを有効にします。デフォルトはtrueです。
  • fields
  • (オプション、文字列の配列) 検索するフィールドの配列。 ワイルドカード(*)をサポートします。
    このパラメータクエリを使用して、複数のフィールドを横断して検索できます。 複数フィールドの検索を参照してください。
  • fuzziness
  • (オプション、文字列) ファジーマッチのために許可される最大編集距離。 ファジー構文については、ファジネスを参照してください。
  • fuzzy_max_expansions
  • (オプション、整数) ファジーマッチのためにクエリが拡張される最大用語数。 デフォルトは50です。
  • fuzzy_prefix_length
  • (オプション、整数) ファジーマッチのために変更されない最初の文字数。 デフォルトは0です。
  • fuzzy_transpositions
  • (オプション、ブール値) trueの場合、ファジーマッチのための編集には隣接する2文字の転置が含まれます (ab → ba)。 デフォルトはtrueです。
  • lenient
  • (オプション、ブール値) trueの場合、数値フィールドにテキスト値を提供するなどの形式ベースのエラーは無視されます。 デフォルトはfalseです。
  • max_determinized_states
  • (オプション、整数) クエリに必要な最大オートマトン状態。 デフォルトは10000です。
    Elasticsearchは、正規表現を解析するために内部でApache Luceneを使用します。Luceneは、各正規表現を有限オートマトンに変換し、いくつかの決定化された状態を含みます。
    このパラメータを使用して、その変換が意図せずにリソースを消費しすぎるのを防ぐことができます。複雑な正規表現を実行するには、この制限を増やす必要がある場合があります。
  • minimum_should_match
  • (オプション、文字列) ドキュメントが返されるために一致する必要がある最小の句の数。 有効な値と詳細については、minimum_should_matchパラメータを参照してください。 minimum_should_matchがどのように機能するかの例を参照してください。
  • quote_analyzer
  • (オプション、文字列) クエリ文字列内の引用されたテキストをトークンに変換するために使用されるアナライザー。 デフォルトは、default_fieldにマッピングされたsearch_quote_analyzerです。
    引用されたテキストの場合、このパラメータはanalyzerパラメータで指定されたアナライザーをオーバーライドします。
  • phrase_slop
  • (オプション、整数) フレーズの一致トークン間で許可される最大位置数。 デフォルトは0です。 0の場合、正確なフレーズの一致が必要です。 転置された用語は2のスロップを持ちます。
  • quote_field_suffix
  • (オプション、文字列) クエリ文字列内の引用されたテキストに追加される接尾辞。
    この接尾辞を使用して、正確な一致のために異なる分析方法を使用できます。 ステミングと正確な検索の混合を参照してください。
  • rewrite
  • (オプション、文字列) クエリを再書きするために使用されるメソッド。有効な値と詳細については、rewriteパラメータを参照してください。
  • time_zone
  • (オプション、文字列) 協定世界時 (UTC) オフセットまたは IANAタイムゾーンを使用して、クエリ文字列内のdate値をUTCに変換します。
    有効な値は、+01:00や-08:00などのISO 8601 UTCオフセット、およびAmerica/Los_AngelesなどのIANAタイムゾーンIDです。
    time_zoneパラメータは、now日付数学値に影響しませんnowは常にUTCの現在のシステム時間です。ただし、time_zoneパラメータは、nowを使用して計算された日付と日付数学の丸めを変換します。たとえば、time_zoneパラメータはnow/dの値を変換します。

ノート

クエリ文字列構文

クエリ文字列「ミニ言語」は、クエリ文字列およびqクエリ文字列パラメータで使用されます。

クエリ文字列は、一連の用語演算子に解析されます。用語は単一の単語(quickまたはbrown)または、二重引用符で囲まれたフレーズ("quick brown")であり、フレーズ内のすべての単語を同じ順序で検索します。

演算子を使用すると、検索をカスタマイズできます。利用可能なオプションは以下に説明されています。

フィールド名

クエリ構文で検索するフィールドを指定できます:

    1. ``````bash
    2. status:active
    3. `
    1. ``````bash
    2. title:(quick OR brown)
    3. `
  • authorフィールドが正確なフレーズ"john smith"を含む場合
    1. author:"John Smith"
  • first nameフィールドがAliceを含む場合(スペースをバックスラッシュでエスケープする必要があることに注意してください)
    1. first\ name:Alice
    1. ``````bash
    2. book.\*:(quick OR brown)
    3. `
    1. ``````bash
    2. _exists_:title
    3. `

ワイルドカード

ワイルドカード検索は、?を使用して単一の文字を置き換え、*を使用してゼロまたはそれ以上の文字を置き換えることで、個々の用語に対して実行できます:

  1. qu?ck bro*

ワイルドカードクエリは膨大なメモリを使用し、非常に悪いパフォーマンスを発揮する可能性があることに注意してください。"a* b* c*"というクエリ文字列に一致するために、どれだけの用語をクエリする必要があるか考えてみてください。

純粋なワイルドカード\*は、効率のためにexistsクエリに書き換えられます。その結果、ワイルドカード"field:*"は、次のような空の値を持つドキュメントに一致します:

  1. {
  2. "field": ""
  3. }

…フィールドが欠落しているか、次のように明示的なNULL値が設定されている場合は一致しません:

  1. {
  2. "field": null
  3. }

単語の先頭にワイルドカードを許可すること(例:"*ing")は特に重いです。なぜなら、すべてのインデックス内の用語を調べる必要があるからです。先頭のワイルドカードは、allow_leading_wildcardfalseに設定することで無効にできます。

文字レベルで動作する分析チェーンの一部のみが適用されます。たとえば、アナライザーが小文字化とステミングの両方を実行する場合、小文字化のみが適用されます。文字が欠落している単語に対してステミングを実行するのは間違いです。

  1. #### 正規表現
  2. 正規表現パターンは、スラッシュ(`````"/"`````)で囲むことによってクエリ文字列に埋め込むことができます:
  3. ``````bash
  4. name:/joh?n(ath[oa]n)/
  5. `

サポートされている正規表現構文は、正規表現構文で説明されています。

  1. ``````bash
  2. /.*n/
  3. `

注意して使用してください!

ファジネス

fuzzyクエリ~演算子を使用して実行できます:

  1. quikc~ brwn~ foks~

これらのクエリでは、クエリ文字列が正規化されます。存在する場合、アナライザーから特定のフィルターのみが適用されます。適用可能なフィルターのリストについては、正規化子を参照してください。

クエリは、ダメラウ・レーヴェンシュタイン距離を使用して、最大2回の変更を持つすべての用語を見つけます。変更は、単一の文字の挿入、削除、または置換、または隣接する2文字の転置です。

デフォルトの編集距離2ですが、1の編集距離は、すべての人間の誤字の80%をキャッチするのに十分であるはずです。次のように指定できます:

  1. quikc~1

ファジネスとワイルドカードの混合を避ける

ファジーワイルドカード演算子の混合はサポートされていません。混合されると、演算子の1つが適用されません。たとえば、app~1(ファジー)またはapp*(ワイルドカード)を検索できますが、app*~1の検索ではファジー演算子(~1)が適用されません。

近接検索

フレーズクエリ(例:"john smith")は、すべての用語が正確に同じ順序であることを期待しますが、近接クエリでは指定された単語がさらに離れているか、異なる順序であることを許可します。ファジークエリが単語内の文字の最大編集距離を指定できるのと同様に、近接検索ではフレーズ内の単語の最大編集距離を指定できます:

  1. "fox quick"~5

フィールド内のテキストがクエリ文字列で指定された元の順序に近いほど、そのドキュメントはより関連性が高いと見なされます。上記の例のクエリと比較すると、フレーズ"quick fox""quick brown fox"よりも関連性が高いと見なされます。

範囲

日付、数値、または文字列フィールドの範囲を指定できます。包括的な範囲は角括弧[min TO max]で指定され、排他的な範囲は波括弧{min TO max}で指定されます。

  • 2012年のすべての日:
    1. date:[2012-01-01 TO 2012-12-31]
  • 数字1..5
    1. count:[1 TO 5]
    1. ``````bash
    2. tag:{alpha TO omega}
    3. `
  • 10以上の数字
    1. count:[10 TO *]
  • 2012年以前の日付
    1. date:{* TO 2012-01-01}

波括弧と角括弧は組み合わせることができます:

  • 1から5未満の数字
    1. count:[1 TO 5}

片側が無制限の範囲は、次の構文を使用できます:

  1. age:>10
  2. age:>=10
  3. age:<10
  4. age:<=10

簡略化された構文で上限と下限を組み合わせるには、AND演算子で2つの句を結合する必要があります:

  1. age:(>=10 AND <20)
  2. age:(+>=10 +<20)

クエリ文字列内の範囲の解析は複雑でエラーが発生しやすいです。明示的なrangeクエリを使用する方がはるかに信頼性があります。

ブースティング

ブースト演算子^を使用して、1つの用語を他の用語よりも関連性を高くします。たとえば、すべてのドキュメントを見つけたいが、特に速いキツネに興味がある場合:

  1. quick^2 fox

デフォルトのboost値は1ですが、任意の正の浮動小数点数にすることができます。

ブーストはフレーズやグループにも適用できます:

  1. "john smith"^2 (foo bar)^4

ブール演算子

デフォルトでは、すべての用語はオプションであり、1つの用語が一致する限りです。foo bar bazの検索は、fooまたはbarまたはbazのいずれかを含む任意のドキュメントを見つけます。すでにdefault_operatorについて説明しましたが、すべての用語を必須にすることもできますが、クエリ文字列自体で使用できるブール演算子もあります。

優先される演算子は+(この用語は必ず存在する必要があります)と-(この用語は存在してはならない)です。他のすべての用語はオプションです。たとえば、このクエリ:

  1. quick brown +fox -news

は次のことを示します:

  • foxは存在する必要があります
  • newsは存在してはならない
  • quickbrownはオプションであり、それらの存在は関連性を高めます

よく知られたブール演算子ANDORNOT&&||!とも書かれます)もサポートされていますが、通常の優先順位ルールを尊重しないため、複数の演算子を一緒に使用する場合は括弧を使用する必要があります。たとえば、前のクエリは次のように書き換えることができます:

  • ((quick AND fox) OR (brown AND fox) OR fox) AND NOT news
  • この形式は、元のクエリのロジックを正しく再現しますが、関連性スコアは元のものとはほとんど関係がありません。

対照的に、matchクエリを使用して書き換えた同じクエリは次のようになります:

  1. {
  2. "bool": {
  3. "must": { "match": "fox" },
  4. "should": { "match": "quick brown" },
  5. "must_not": { "match": "news" }
  6. }
  7. }

グルーピング

複数の用語や句を括弧でグループ化してサブクエリを形成できます:

  1. (quick OR brown) AND fox

グループは特定のフィールドをターゲットにしたり、サブクエリの結果をブーストしたりするために使用できます:

  1. status:(active OR pending) title:(full text search)^2

予約文字

クエリ自体で演算子として機能する文字を使用する必要がある場合(演算子としてではなく)、先頭にバックスラッシュを付けてエスケープする必要があります。たとえば、(1+1)=2を検索するには、クエリを\(1\+1\)\=2として記述する必要があります。リクエストボディにJSONを使用する場合、2つの前のバックスラッシュ(\\)が必要です。バックスラッシュはJSON文字列内で予約されたエスケープ文字です。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "query_string": {
  5. "query": "kimchy\\!",
  6. "fields": [
  7. "user.id"
  8. ]
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. query_string: {
  6. query: 'kimchy\\!',
  7. fields: [
  8. 'user.id'
  9. ]
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. query_string: {
  5. query: "kimchy\\!",
  6. fields: ["user.id"],
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET /my-index-000001/_search
  2. {
  3. "query" : {
  4. "query_string" : {
  5. "query" : "kimchy\\!",
  6. "fields" : ["user.id"]
  7. }
  8. }
  9. }

予約文字は次のとおりです: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

これらの特殊文字を正しくエスケープしないと、クエリが実行されない構文エラーが発生する可能性があります。

  1. #### 空白と空のクエリ
  2. 空白は演算子とは見なされません。
  3. クエリ文字列が空であるか、空白のみを含む場合、クエリは空の結果セットを返します。
  4. #### ネストされたドキュメントに対してquery_stringクエリを使用しない
  5. `````query_string`````検索は、[ネストされた](/read/elasticsearch-8-15/5ccf197014f16687.md)ドキュメントを返しません。ネストされたドキュメントを検索するには、[`````nested`````クエリ](/read/elasticsearch-8-15/8886f20469cb015a.md)を使用してください。
  6. #### 複数フィールドの検索
  7. `````fields`````パラメータを使用して、複数のフィールドに対して`````query_string`````検索を実行できます。
  8. 複数のフィールドに対して`````query_string`````クエリを実行するアイデアは、各クエリ用語を次のようなOR句に展開することです:
  9. ``````bash
  10. field1:query_term OR field2:query_term | ...
  11. `

たとえば、次のクエリ

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "content",
  6. "name"
  7. ],
  8. "query": "this AND that"
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'content',
  7. 'name'
  8. ],
  9. query: 'this AND that'
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "content",
  7. "name"
  8. ],
  9. "query": "this AND that"
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["content", "name"],
  5. query: "this AND that",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "fields": [ "content", "name" ],
  6. "query": "this AND that"
  7. }
  8. }
  9. }

同じ単語に一致します

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "query": "(content:this OR name:this) AND (content:that OR name:that)"
  5. }
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. query: '(content:this OR name:this) AND (content:that OR name:that)'
  6. }
  7. }
  8. }
  9. )
  10. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "query": "(content:this OR name:this) AND (content:that OR name:that)"
  6. }
  7. }
  8. }`)),
  9. es.Search.WithPretty(),
  10. )
  11. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. query: "(content:this OR name:this) AND (content:that OR name:that)",
  5. },
  6. },
  7. });
  8. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "query": "(content:this OR name:this) AND (content:that OR name:that)"
  6. }
  7. }
  8. }

複数のクエリが個々の検索用語から生成されるため、それらを組み合わせることは自動的にdis_maxクエリとtie_breakerを使用して行われます。たとえば(name^5表記を使用して5倍にブーストされます):

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "content",
  6. "name^5"
  7. ],
  8. "query": "this AND that OR thus",
  9. "tie_breaker": 0
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'content',
  7. 'name^5'
  8. ],
  9. query: 'this AND that OR thus',
  10. tie_breaker: 0
  11. }
  12. }
  13. }
  14. )
  15. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "content",
  7. "name^5"
  8. ],
  9. "query": "this AND that OR thus",
  10. "tie_breaker": 0
  11. }
  12. }
  13. }`)),
  14. es.Search.WithPretty(),
  15. )
  16. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["content", "name^5"],
  5. query: "this AND that OR thus",
  6. tie_breaker: 0,
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "fields" : ["content", "name^5"],
  6. "query" : "this AND that OR thus",
  7. "tie_breaker" : 0
  8. }
  9. }
  10. }

単純なワイルドカードを使用して、ドキュメントの特定の内部要素の「内側」で検索することもできます。たとえば、cityオブジェクトに複数のフィールド(またはフィールドを持つ内部オブジェクト)がある場合、すべての「city」フィールドで自動的に検索できます:

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "city.*"
  6. ],
  7. "query": "this AND that OR thus"
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'city.*'
  7. ],
  8. query: 'this AND that OR thus'
  9. }
  10. }
  11. }
  12. )
  13. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "city.*"
  7. ],
  8. "query": "this AND that OR thus"
  9. }
  10. }
  11. }`)),
  12. es.Search.WithPretty(),
  13. )
  14. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["city.*"],
  5. query: "this AND that OR thus",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "fields" : ["city.*"],
  6. "query" : "this AND that OR thus"
  7. }
  8. }
  9. }

もう1つのオプションは、クエリ文字列自体にワイルドカードフィールド検索を提供することです(*記号を適切にエスケープして)、たとえば: city.\*:something:

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "query": "city.\\*:(this AND that OR thus)"
  5. }
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. query: 'city.\\*:(this AND that OR thus)'
  6. }
  7. }
  8. }
  9. )
  10. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "query": "city.\\*:(this AND that OR thus)"
  6. }
  7. }
  8. }`)),
  9. es.Search.WithPretty(),
  10. )
  11. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. query: "city.\\*:(this AND that OR thus)",
  5. },
  6. },
  7. });
  8. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "query" : "city.\\*:(this AND that OR thus)"
  6. }
  7. }
  8. }
  1. フィールドパラメータには、パターンベースのフィールド名も含めることができ、関連するフィールドに自動的に展開されます(動的に導入されたフィールドを含む)。たとえば:
  2. #### Python
  3. ``````python
  4. resp = client.search(
  5. query={
  6. "query_string": {
  7. "fields": [
  8. "content",
  9. "name.*^5"
  10. ],
  11. "query": "this AND that OR thus"
  12. }
  13. },
  14. )
  15. print(resp)
  16. `

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'content',
  7. 'name.*^5'
  8. ],
  9. query: 'this AND that OR thus'
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "content",
  7. "name.*^5"
  8. ],
  9. "query": "this AND that OR thus"
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["content", "name.*^5"],
  5. query: "this AND that OR thus",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "fields" : ["content", "name.*^5"],
  6. "query" : "this AND that OR thus"
  7. }
  8. }
  9. }

複数フィールド検索の追加パラメータ

  1. - `````type
  • (オプション、文字列) クエリがドキュメントに一致し、スコアを付ける方法を決定します。有効な値は次のとおりです:
    • best_fields (デフォルト)
    • 任意のフィールドに一致するドキュメントを見つけ、マッチするフィールドの最高_scoreを使用します。 best_fieldsを参照してください。
    • bool_prefix
    • 各フィールドにmatch_bool_prefixクエリを作成し、各フィールドから_scoreを組み合わせます。 bool_prefixを参照してください。
    • cross_fields
    • 同じanalyzerを持つフィールドを1つの大きなフィールドのように扱います。 任意のフィールド内の各単語を探します。 cross_fieldsを参照してください。
    • most_fields
    • 任意のフィールドに一致するドキュメントを見つけ、各フィールドから_scoreを組み合わせます。 most_fieldsを参照してください。
    • phrase
    • 各フィールドにmatch_phraseクエリを実行し、最良のフィールドから_scoreを使用します。 phraseおよびphrase_prefixを参照してください。
    • phrase_prefix
    • 各フィールドにmatch_phrase_prefixクエリを実行し、最良のフィールドから_scoreを使用します。 phraseおよびphrase_prefixを参照してください。
      注: 追加のトップレベルmulti_matchパラメータは、type値に基づいて利用可能な場合があります。

同義語とquery_stringクエリ

query_stringクエリは、同義語グラフトークンフィルターを使用して、マルチターム同義語の展開をサポートしています。このフィルターが使用されると、パーサーは各マルチターム同義語のためにフレーズクエリを作成します。たとえば、次の同義語: ny, new yorkは次のようになります:

(ny OR ("new york"))

同義語を接続詞で一致させることも可能です:

Php

  1. $params = [
  2. 'body' => [
  3. 'query' => [
  4. 'query_string' => [
  5. 'default_field' => 'title',
  6. 'query' => 'ny city',
  7. 'auto_generate_synonyms_phrase_query' => false,
  8. ],
  9. ],
  10. ],
  11. ];
  12. $response = $client->search($params);

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "default_field": "title",
  5. "query": "ny city",
  6. "auto_generate_synonyms_phrase_query": False
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. default_field: 'title',
  6. query: 'ny city',
  7. auto_generate_synonyms_phrase_query: false
  8. }
  9. }
  10. }
  11. )
  12. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "default_field": "title",
  6. "query": "ny city",
  7. "auto_generate_synonyms_phrase_query": false
  8. }
  9. }
  10. }`)),
  11. es.Search.WithPretty(),
  12. )
  13. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. default_field: "title",
  5. query: "ny city",
  6. auto_generate_synonyms_phrase_query: false,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string" : {
  5. "default_field": "title",
  6. "query" : "ny city",
  7. "auto_generate_synonyms_phrase_query" : false
  8. }
  9. }
  10. }

上記の例は、ブールクエリを作成します:

(ny OR (new AND york)) city

これは、用語 ny または接続詞 new AND york を持つドキュメントに一致します。デフォルトでは、パラメータ auto_generate_synonyms_phrase_querytrue に設定されています。

How minimum_should_match works

query_string は、各演算子の周りでクエリを分割し、全体の入力に対するブールクエリを作成します。minimum_should_match を使用して、結果のクエリ内の「should」句がいくつ一致するべきかを制御できます。

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "title"
  6. ],
  7. "query": "this that thus",
  8. "minimum_should_match": 2
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'title'
  7. ],
  8. query: 'this that thus',
  9. minimum_should_match: 2
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title"
  7. ],
  8. "query": "this that thus",
  9. "minimum_should_match": 2
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["title"],
  5. query: "this that thus",
  6. minimum_should_match: 2,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title"
  7. ],
  8. "query": "this that thus",
  9. "minimum_should_match": 2
  10. }
  11. }
  12. }

上記の例は、ブールクエリを作成します:

(title:this title:that title:thus)~2

これは、単一のフィールド title において、用語 thisthat または thus のうち少なくとも2つを持つドキュメントに一致します。

How minimum_should_match works for multiple fields

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "title",
  6. "content"
  7. ],
  8. "query": "this that thus",
  9. "minimum_should_match": 2
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'title',
  7. 'content'
  8. ],
  9. query: 'this that thus',
  10. minimum_should_match: 2
  11. }
  12. }
  13. }
  14. )
  15. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title",
  7. "content"
  8. ],
  9. "query": "this that thus",
  10. "minimum_should_match": 2
  11. }
  12. }
  13. }`)),
  14. es.Search.WithPretty(),
  15. )
  16. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["title", "content"],
  5. query: "this that thus",
  6. minimum_should_match: 2,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title",
  7. "content"
  8. ],
  9. "query": "this that thus",
  10. "minimum_should_match": 2
  11. }
  12. }
  13. }

上記の例は、ブールクエリを作成します:

((content:this content:that content:thus) | (title:this title:that title:thus))

これは、フィールド titlecontent の最大の選択肢を持つドキュメントに一致します。ここでは、minimum_should_match パラメータは適用できません。

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "title",
  6. "content"
  7. ],
  8. "query": "this OR that OR thus",
  9. "minimum_should_match": 2
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'title',
  7. 'content'
  8. ],
  9. query: 'this OR that OR thus',
  10. minimum_should_match: 2
  11. }
  12. }
  13. }
  14. )
  15. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title",
  7. "content"
  8. ],
  9. "query": "this OR that OR thus",
  10. "minimum_should_match": 2
  11. }
  12. }
  13. }`)),
  14. es.Search.WithPretty(),
  15. )
  16. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["title", "content"],
  5. query: "this OR that OR thus",
  6. minimum_should_match: 2,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title",
  7. "content"
  8. ],
  9. "query": "this OR that OR thus",
  10. "minimum_should_match": 2
  11. }
  12. }
  13. }

明示的な演算子を追加すると、各用語が別々の句として考慮されることが強制されます。

上記の例は、ブールクエリを作成します:

((content:this | title:this) (content:that | title:that) (content:thus | title:thus))~2

これは、3つの「should」句のうち少なくとも2つに一致し、それぞれが各用語のフィールドに対する最大の選択肢で構成されています。

How minimum_should_match works for cross-field searches

フィールド type における cross_fields の値は、同じアナライザーを持つフィールドが入力が分析されるときにグループ化されることを示します。

Python

  1. resp = client.search(
  2. query={
  3. "query_string": {
  4. "fields": [
  5. "title",
  6. "content"
  7. ],
  8. "query": "this OR that OR thus",
  9. "type": "cross_fields",
  10. "minimum_should_match": 2
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. query_string: {
  5. fields: [
  6. 'title',
  7. 'content'
  8. ],
  9. query: 'this OR that OR thus',
  10. type: 'cross_fields',
  11. minimum_should_match: 2
  12. }
  13. }
  14. }
  15. )
  16. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title",
  7. "content"
  8. ],
  9. "query": "this OR that OR thus",
  10. "type": "cross_fields",
  11. "minimum_should_match": 2
  12. }
  13. }
  14. }`)),
  15. es.Search.WithPretty(),
  16. )
  17. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. query_string: {
  4. fields: ["title", "content"],
  5. query: "this OR that OR thus",
  6. type: "cross_fields",
  7. minimum_should_match: 2,
  8. },
  9. },
  10. });
  11. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "fields": [
  6. "title",
  7. "content"
  8. ],
  9. "query": "this OR that OR thus",
  10. "type": "cross_fields",
  11. "minimum_should_match": 2
  12. }
  13. }
  14. }

上記の例は、ブールクエリを作成します:

(blended(terms:[field2:this, field1:this]) blended(terms:[field2:that, field1:that]) blended(terms:[field2:thus, field1:thus]))~2

これは、3つの各用語のブレンドされたクエリのうち少なくとも2つを持つドキュメントに一致します。

Allow expensive queries

クエリ文字列クエリは、内部的に prefix query に変換される可能性があり、これは、接頭辞クエリが こちら で説明されているように無効にされている場合、クエリが実行されず、例外がスローされることを意味します。