シンプルなクエリ文字列クエリ

提供されたクエリ文字列に基づいてドキュメントを返します。これは、限られたが耐障害性のある構文を持つパーサーを使用します。

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

その構文はquery_stringクエリよりも制限されていますが、simple_query_stringクエリは無効な構文に対してエラーを返しません。代わりに、クエリ文字列の無効な部分を無視します。

例のリクエスト

Python

  1. resp = client.search(
  2. query={
  3. "simple_query_string": {
  4. "query": "\"fried eggs\" +(eggplant | potato) -frittata",
  5. "fields": [
  6. "title^5",
  7. "body"
  8. ],
  9. "default_operator": "and"
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. simple_query_string: {
  5. query: '"fried eggs" +(eggplant | potato) -frittata',
  6. fields: [
  7. 'title^5',
  8. 'body'
  9. ],
  10. default_operator: 'and'
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. simple_query_string: {
  4. query: '"fried eggs" +(eggplant | potato) -frittata',
  5. fields: ["title^5", "body"],
  6. default_operator: "and",
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "simple_query_string" : {
  5. "query": "\"fried eggs\" +(eggplant | potato) -frittata",
  6. "fields": ["title^5", "body"],
  7. "default_operator": "and"
  8. }
  9. }
  10. }

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

  • query
  • (必須、文字列) 解析して検索に使用したいクエリ文字列。 シンプルなクエリ文字列構文を参照してください。
  • fields
  • (オプション、文字列の配列) 検索したいフィールドの配列。
    このフィールドはワイルドカード式を受け入れます。また、キャレット(^)表記を使用して特定のフィールドへのマッチの関連性スコアをブーストすることもできます。 fieldsパラメータにおけるワイルドカードとフィールドごとのブーストの例を参照してください。
    デフォルトはindex.query.default_fieldインデックス設定で、デフォルト値は*です。*値は、用語クエリに適格なすべてのフィールドを抽出し、メタデータフィールドをフィルタリングします。抽出されたすべてのフィールドは、prefixが指定されていない場合にクエリを構築するために組み合わされます。
    一度にクエリできるフィールドの数には制限があります。これは、indices.query.bool.max_clause_count 検索設定によって定義されており、デフォルトは1024です。
  • default_operator
  • (オプション、文字列) 演算子が指定されていない場合にクエリ文字列内のテキストを解釈するために使用されるデフォルトのブール論理。 有効な値は次のとおりです:
    • OR (デフォルト)
    • たとえば、capital of Hungaryのクエリ文字列はcapital OR of OR Hungaryとして解釈されます。
    • AND
    • たとえば、capital of Hungaryのクエリ文字列はcapital AND of AND Hungaryとして解釈されます。
  • analyze_wildcard
  • (オプション、ブール) trueの場合、クエリはクエリ文字列内のワイルドカード用語を分析しようとします。 デフォルトはfalseです。
  • analyzer
  • (オプション、文字列) アナライザーは、クエリ文字列内のテキストをトークンに変換するために使用されます。 デフォルトは、default_fieldにマッピングされたインデックス時アナライザーです。アナライザーがマッピングされていない場合、インデックスのデフォルトアナライザーが使用されます。
  • auto_generate_synonyms_phrase_query
  • (オプション、ブール) trueの場合、パーサーは各multi-position tokenのためにmatch_phraseクエリを作成します。 デフォルトはtrueです。例については、マルチポジショントークンを参照してください。
  • flags
  • (オプション、文字列) シンプルなクエリ文字列構文の有効な演算子のリスト。 デフォルトはALL (すべての演算子)です。有効な値については、演算子の制限を参照してください。
  • fuzzy_max_expansions
  • (オプション、整数) クエリがファジーマッチのために拡張する用語の最大数。 デフォルトは50です。
  • fuzzy_prefix_length
  • (オプション、整数) ファジーマッチのために変更されない最初の文字の数。 デフォルトは0です。
  • fuzzy_transpositions
  • (オプション、ブール) trueの場合、ファジーマッチのための編集には隣接する2文字の転置(ab → ba)が含まれます。 デフォルトはtrueです。
  • lenient
  • (オプション、ブール) trueの場合、数値フィールドにテキスト値を提供するなどの形式ベースのエラーは無視されます。 デフォルトはfalseです。
  • minimum_should_match
  • (オプション、文字列) ドキュメントが返されるために一致しなければならない最小のクローズ数。 有効な値と詳細については、minimum_should_matchパラメータを参照してください。
  • quote_field_suffix
  • (オプション、文字列) クエリ文字列内の引用されたテキストに追加される接尾辞。
    この接尾辞を使用して、正確な一致のために異なる分析方法を使用できます。 ステミングと正確な検索の混合を参照してください。

ノート

シンプルなクエリ文字列構文

  1. - `````+`````AND操作を示します
  2. - `````|`````OR操作を示します
  3. - `````-`````は単一トークンを否定します
  4. - `````"`````は検索のためのフレーズを示すために複数のトークンをラップします
  5. - `````*`````は用語の末尾にあり、接頭辞クエリを示します
  6. - `````(``````````)`````は優先順位を示します
  7. - `````~N`````は単語の後にあり、編集距離(ファジーさ)を示します
  8. - `````~N`````はフレーズの後にあり、スロップ量を示します
  9. これらの文字のいずれかを文字通り使用するには、前にバックスラッシュ(`````\`````)でエスケープします。
  10. これらの演算子の動作は、`````default_operator`````値によって異なる場合があります。たとえば:
  11. #### Python
  12. ``````python
  13. resp = client.search(
  14. query={
  15. "simple_query_string": {
  16. "fields": [
  17. "content"
  18. ],
  19. "query": "foo bar -baz"
  20. }
  21. },
  22. )
  23. print(resp)
  24. `

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. simple_query_string: {
  5. fields: [
  6. 'content'
  7. ],
  8. query: 'foo bar -baz'
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. simple_query_string: {
  4. fields: ["content"],
  5. query: "foo bar -baz",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "simple_query_string": {
  5. "fields": [ "content" ],
  6. "query": "foo bar -baz"
  7. }
  8. }
  9. }

この検索は、fooまたはbarを含むドキュメントを返すことを意図していますが、bazを含まないドキュメントも返します。しかし、default_operatorORのために、この検索は実際にはfooまたはbarを含むドキュメントと、bazを含まないドキュメントを返します。意図した通りにドキュメントを返すには、クエリ文字列をfoo bar +-bazに変更してください。

演算子の制限

  1. 特定の演算子のみを明示的に有効にするには、`````|`````区切りを使用します。たとえば、`````flags`````の値が`````OR|AND|PREFIX`````の場合、`````OR``````````AND``````````PREFIX`````を除くすべての演算子が無効になります。
  2. #### Python
  3. ``````python
  4. resp = client.search(
  5. query={
  6. "simple_query_string": {
  7. "query": "foo | bar + baz*",
  8. "flags": "OR|AND|PREFIX"
  9. }
  10. },
  11. )
  12. print(resp)
  13. `

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. simple_query_string: {
  5. query: 'foo | bar + baz*',
  6. flags: 'OR|AND|PREFIX'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. simple_query_string: {
  4. query: "foo | bar + baz*",
  5. flags: "OR|AND|PREFIX",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "simple_query_string": {
  5. "query": "foo | bar + baz*",
  6. "flags": "OR|AND|PREFIX"
  7. }
  8. }
  9. }

有効な値

利用可能なフラグは次のとおりです:

  • ALL (デフォルト)
  • すべてのオプション演算子を有効にします。
  • AND
  • + AND演算子を有効にします。
  • ESCAPE
  • \をエスケープ文字として有効にします。
  • FUZZY
  • 単語の後に~N演算子を有効にし、Nはマッチングのための許可された編集距離を示す整数です。ファジーさを参照してください。
  • NEAR
  • フレーズの後に~N演算子を有効にし、Nはマッチングトークン間の許可される最大位置数を示します。SLOPと同義です。
  • NONE
  • すべての演算子を無効にします。
  • NOT
  • - NOT演算子を有効にします。
  • OR
  • \| OR演算子を有効にします。
  • PHRASE
  • フレーズを検索するために使用される"引用符演算子を有効にします。
  • PRECEDENCE
  • 演算子の優先順位を制御するために(および)演算子を有効にします。
  • PREFIX
  • 接頭辞演算子*を有効にします。
  • SLOP
  • フレーズの後に~N演算子を有効にし、Nはマッチングトークン間の許可される最大位置数を示します。NEARと同義です。
  • WHITESPACE
  • 空白を分割文字として有効にします。

フィールドパラメータにおけるワイルドカードとフィールドごとのブースト

フィールドはワイルドカードで指定できます。例:

Python

  1. resp = client.search(
  2. query={
  3. "simple_query_string": {
  4. "query": "Will Smith",
  5. "fields": [
  6. "title",
  7. "*_name"
  8. ]
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. simple_query_string: {
  5. query: 'Will Smith',
  6. fields: [
  7. 'title',
  8. '*_name'
  9. ]
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. simple_query_string: {
  4. query: "Will Smith",
  5. fields: ["title", "*_name"],
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "simple_query_string" : {
  5. "query": "Will Smith",
  6. "fields": [ "title", "*_name" ]
  7. }
  8. }
  9. }
titlefirst_namelast_nameフィールドをクエリします。

個々のフィールドはキャレット(^)表記でブーストできます:

Python

  1. resp = client.search(
  2. query={
  3. "simple_query_string": {
  4. "query": "this is a test",
  5. "fields": [
  6. "subject^3",
  7. "message"
  8. ]
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. simple_query_string: {
  5. query: 'this is a test',
  6. fields: [
  7. 'subject^3',
  8. 'message'
  9. ]
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. simple_query_string: {
  4. query: "this is a test",
  5. fields: ["subject^3", "message"],
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "simple_query_string" : {
  5. "query" : "this is a test",
  6. "fields" : [ "subject^3", "message" ]
  7. }
  8. }
  9. }
subjectフィールドはmessageフィールドの3倍重要です。

マルチポジショントークン

デフォルトでは、simple_query_stringクエリパーサーは、クエリ文字列内の各multi-position tokenのためにmatch_phraseクエリを作成します。たとえば、パーサーはマルチワード同義語ny, new yorkのためにmatch_phraseクエリを作成します:

(ny OR ("new york"))

  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. query={
  5. "simple_query_string": {
  6. "query": "ny city",
  7. "auto_generate_synonyms_phrase_query": False
  8. }
  9. },
  10. )
  11. print(resp)
  12. `

Ruby

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

Js

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

コンソール

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

上記の例では、パーサーは次のboolクエリを作成します:

(ny OR (new AND york)) city)

このboolクエリは、nyという用語またはnew AND yorkという接続詞を持つドキュメントに一致します。