シンプルなクエリ文字列クエリ
提供されたクエリ文字列に基づいてドキュメントを返します。これは、限られたが耐障害性のある構文を持つパーサーを使用します。
このクエリは、特別な演算子に基づいて提供されたクエリ文字列を用語に解析し分割するためにシンプルな構文を使用します。クエリは、マッチするドキュメントを返す前に、各用語を独立して分析します。
その構文はquery_string
クエリよりも制限されていますが、simple_query_string
クエリは無効な構文に対してエラーを返しません。代わりに、クエリ文字列の無効な部分を無視します。
例のリクエスト
Python
resp = client.search(
query={
"simple_query_string": {
"query": "\"fried eggs\" +(eggplant | potato) -frittata",
"fields": [
"title^5",
"body"
],
"default_operator": "and"
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
simple_query_string: {
query: '"fried eggs" +(eggplant | potato) -frittata',
fields: [
'title^5',
'body'
],
default_operator: 'and'
}
}
}
)
puts response
Js
const response = await client.search({
query: {
simple_query_string: {
query: '"fried eggs" +(eggplant | potato) -frittata',
fields: ["title^5", "body"],
default_operator: "and",
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"simple_query_string" : {
"query": "\"fried eggs\" +(eggplant | potato) -frittata",
"fields": ["title^5", "body"],
"default_operator": "and"
}
}
}
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
- (オプション、文字列) クエリ文字列内の引用されたテキストに追加される接尾辞。
この接尾辞を使用して、正確な一致のために異なる分析方法を使用できます。 ステミングと正確な検索の混合を参照してください。
ノート
シンプルなクエリ文字列構文
- `````+`````はAND操作を示します
- `````|`````はOR操作を示します
- `````-`````は単一トークンを否定します
- `````"`````は検索のためのフレーズを示すために複数のトークンをラップします
- `````*`````は用語の末尾にあり、接頭辞クエリを示します
- `````(`````と`````)`````は優先順位を示します
- `````~N`````は単語の後にあり、編集距離(ファジーさ)を示します
- `````~N`````はフレーズの後にあり、スロップ量を示します
これらの文字のいずれかを文字通り使用するには、前にバックスラッシュ(`````\`````)でエスケープします。
これらの演算子の動作は、`````default_operator`````値によって異なる場合があります。たとえば:
#### Python
``````python
resp = client.search(
query={
"simple_query_string": {
"fields": [
"content"
],
"query": "foo bar -baz"
}
},
)
print(resp)
`
Ruby
response = client.search(
body: {
query: {
simple_query_string: {
fields: [
'content'
],
query: 'foo bar -baz'
}
}
}
)
puts response
Js
const response = await client.search({
query: {
simple_query_string: {
fields: ["content"],
query: "foo bar -baz",
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"simple_query_string": {
"fields": [ "content" ],
"query": "foo bar -baz"
}
}
}
この検索は、foo
またはbar
を含むドキュメントを返すことを意図していますが、baz
を含まないドキュメントも返します。しかし、default_operator
のOR
のために、この検索は実際にはfoo
またはbar
を含むドキュメントと、baz
を含まないドキュメントを返します。意図した通りにドキュメントを返すには、クエリ文字列をfoo bar +-baz
に変更してください。
演算子の制限
特定の演算子のみを明示的に有効にするには、`````|`````区切りを使用します。たとえば、`````flags`````の値が`````OR|AND|PREFIX`````の場合、`````OR`````、`````AND`````、`````PREFIX`````を除くすべての演算子が無効になります。
#### Python
``````python
resp = client.search(
query={
"simple_query_string": {
"query": "foo | bar + baz*",
"flags": "OR|AND|PREFIX"
}
},
)
print(resp)
`
Ruby
response = client.search(
body: {
query: {
simple_query_string: {
query: 'foo | bar + baz*',
flags: 'OR|AND|PREFIX'
}
}
}
)
puts response
Js
const response = await client.search({
query: {
simple_query_string: {
query: "foo | bar + baz*",
flags: "OR|AND|PREFIX",
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"simple_query_string": {
"query": "foo | bar + baz*",
"flags": "OR|AND|PREFIX"
}
}
}
有効な値
利用可能なフラグは次のとおりです:
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
resp = client.search(
query={
"simple_query_string": {
"query": "Will Smith",
"fields": [
"title",
"*_name"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
simple_query_string: {
query: 'Will Smith',
fields: [
'title',
'*_name'
]
}
}
}
)
puts response
Js
const response = await client.search({
query: {
simple_query_string: {
query: "Will Smith",
fields: ["title", "*_name"],
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"simple_query_string" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
title 、first_name 、last_name フィールドをクエリします。 |
個々のフィールドはキャレット(^
)表記でブーストできます:
Python
resp = client.search(
query={
"simple_query_string": {
"query": "this is a test",
"fields": [
"subject^3",
"message"
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
simple_query_string: {
query: 'this is a test',
fields: [
'subject^3',
'message'
]
}
}
}
)
puts response
Js
const response = await client.search({
query: {
simple_query_string: {
query: "this is a test",
fields: ["subject^3", "message"],
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"simple_query_string" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ]
}
}
}
subject フィールドはmessage フィールドの3倍重要です。 |
マルチポジショントークン
デフォルトでは、simple_query_string
クエリパーサーは、クエリ文字列内の各multi-position tokenのためにmatch_phrase
クエリを作成します。たとえば、パーサーはマルチワード同義語ny, new york
のためにmatch_phrase
クエリを作成します:
(ny OR ("new york"))
#### Python
``````python
resp = client.search(
query={
"simple_query_string": {
"query": "ny city",
"auto_generate_synonyms_phrase_query": False
}
},
)
print(resp)
`
Ruby
response = client.search(
body: {
query: {
simple_query_string: {
query: 'ny city',
auto_generate_synonyms_phrase_query: false
}
}
}
)
puts response
Js
const response = await client.search({
query: {
simple_query_string: {
query: "ny city",
auto_generate_synonyms_phrase_query: false,
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"simple_query_string": {
"query": "ny city",
"auto_generate_synonyms_phrase_query": false
}
}
}
上記の例では、パーサーは次のbool
クエリを作成します:
(ny OR (new AND york)) city)
このbool
クエリは、ny
という用語またはnew AND york
という接続詞を持つドキュメントに一致します。