简单查询字符串查询
编辑简单查询字符串查询
编辑基于提供的查询字符串返回文档,使用具有有限但容错语法的解析器。
此查询使用简单语法来解析和拆分提供的查询字符串,根据特殊运算符将其拆分为词项。然后,查询在返回匹配文档之前,独立分析每个词项。
虽然其语法比 query_string
查询更有限,但 simple_query_string
查询不会因无效语法而返回错误。相反,它会忽略查询字符串的任何无效部分。
示例请求
编辑resp = client.search( query={ "simple_query_string": { "query": "\"fried eggs\" +(eggplant | potato) -frittata", "fields": [ "title^5", "body" ], "default_operator": "and" } }, ) print(resp)
response = client.search( body: { query: { simple_query_string: { query: '"fried eggs" +(eggplant | potato) -frittata', fields: [ 'title^5', 'body' ], default_operator: 'and' } } } ) puts response
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
,则解析器为每个多位置词条创建match_phrase
查询。默认为true
。有关示例,请参阅多位置词条。 -
flags
- (可选,字符串)简单查询字符串语法的启用运算符列表。默认为
ALL
(所有运算符)。有关有效值,请参阅限制运算符。 -
fuzzy_max_expansions
- (可选,整数)查询扩展以进行模糊匹配的最大词项数。默认为
50
。 -
fuzzy_prefix_length
- (可选,整数)进行模糊匹配时保持不变的起始字符数。默认为
0
。 -
fuzzy_transpositions
- (可选,布尔值)如果为
true
,则模糊匹配的编辑包括两个相邻字符的换位(ab → ba)。默认为true
。 -
lenient
- (可选,布尔值)如果为
true
,则会忽略基于格式的错误,例如为数值字段提供文本值。默认为false
。 -
minimum_should_match
- (可选,字符串)必须匹配的最小子句数才能返回文档。有关有效值和更多信息,请参阅
minimum_should_match
参数。 -
quote_field_suffix
-
(可选,字符串)附加到查询字符串中带引号文本的后缀。
您可以使用此后缀为精确匹配使用不同的分析方法。请参阅混合精确搜索与词干提取。
说明
编辑简单查询字符串语法
编辑simple_query_string
查询支持以下运算符:
-
+
表示 AND 操作 -
|
表示 OR 操作 -
-
对单个词条求反 -
"
将多个词条包装起来以表示用于搜索的短语 -
词项末尾的
*
表示前缀查询 -
(
和)
表示优先级 -
单词后的
~N
表示编辑距离(模糊性) -
短语后的
~N
表示允许的间隙量
要按字面意思使用这些字符之一,请使用前导反斜杠 (\
) 对其进行转义。
这些运算符的行为可能会因 default_operator
值而异。例如:
resp = client.search( query={ "simple_query_string": { "fields": [ "content" ], "query": "foo bar -baz" } }, ) print(resp)
response = client.search( body: { query: { simple_query_string: { fields: [ 'content' ], query: 'foo bar -baz' } } } ) puts response
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
参数来限制简单查询字符串语法支持的运算符。
要仅显式启用特定运算符,请使用 |
分隔符。例如,flags
值为 OR|AND|PREFIX
将禁用除 OR
、AND
和 PREFIX
之外的所有运算符。
resp = client.search( query={ "simple_query_string": { "query": "foo | bar + baz*", "flags": "OR|AND|PREFIX" } }, ) print(resp)
response = client.search( body: { query: { simple_query_string: { query: 'foo | bar + baz*', flags: 'OR|AND|PREFIX' } } } ) puts response
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
- 启用空格作为拆分字符。
fields
参数中的通配符和每个字段的提升
编辑可以使用通配符指定字段,例如:
resp = client.search( query={ "simple_query_string": { "query": "Will Smith", "fields": [ "title", "*_name" ] } }, ) print(resp)
response = client.search( body: { query: { simple_query_string: { query: 'Will Smith', fields: [ 'title', '*_name' ] } } } ) puts response
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" ] } } }
可以使用插入符号 (^
) 表示法来提升各个字段:
resp = client.search( query={ "simple_query_string": { "query": "this is a test", "fields": [ "subject^3", "message" ] } }, ) print(resp)
response = client.search( body: { query: { simple_query_string: { query: 'this is a test', fields: [ 'subject^3', 'message' ] } } } ) puts response
const response = await client.search({ query: { simple_query_string: { query: "this is a test", fields: ["subject^3", "message"], }, }, }); console.log(response);
多位置词条
编辑默认情况下,simple_query_string
查询解析器为查询字符串中的每个多位置词条创建match_phrase
查询。例如,解析器为多词同义词 ny, new york
创建 match_phrase
查询:
(ny OR ("new york"))
要使用 AND
连接匹配多位置词条,请将 auto_generate_synonyms_phrase_query
设置为 false
:
resp = client.search( query={ "simple_query_string": { "query": "ny city", "auto_generate_synonyms_phrase_query": False } }, ) print(resp)
response = client.search( body: { query: { simple_query_string: { query: 'ny city', auto_generate_synonyms_phrase_query: false } } } ) puts response
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
的文档。