简单查询字符串查询
编辑简单查询字符串查询编辑
根据提供的查询字符串,使用语法有限但容错的解析器返回文档。
此查询使用简单语法来解析提供的查询字符串,并根据特殊运算符将其拆分为词条。然后,查询在返回匹配文档之前,会分别分析每个词条。
虽然其语法比query_string
查询更受限制,但simple_query_string
查询不会因语法无效而返回错误。相反,它会忽略查询字符串中任何无效的部分。
示例请求编辑
response = client.search( body: { query: { simple_query_string: { query: '"fried eggs" +(eggplant | potato) -frittata', fields: [ 'title^5', 'body' ], default_operator: 'and' } } } ) puts 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
值而异。例如:
response = client.search( body: { query: { simple_query_string: { fields: [ 'content' ], query: 'foo bar -baz' } } } ) puts 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
之外的所有运算符。
response = client.search( body: { query: { simple_query_string: { query: 'foo | bar + baz*', flags: 'OR|AND|PREFIX' } } } ) puts response
GET /_search { "query": { "simple_query_string": { "query": "foo | bar + baz*", "flags": "OR|AND|PREFIX" } } }
有效值编辑
可用的标志有:
-
ALL
(默认) - 启用所有可选运算符。
-
AND
- AND
-
启用
+
AND 运算符。 - ESCAPE
-
启用
\
作为转义字符。 - FUZZY
-
在词条后启用
~N
运算符,其中N
是一个整数,表示匹配允许的编辑距离。请参阅模糊度。 - NEAR
-
在短语后启用
~N
运算符,其中N
是匹配词条之间允许的最大位置数。与SLOP
同义。 - NONE
-
禁用所有运算符。
- NOT
-
启用
-
NOT 运算符。 - OR
-
启用
\|
OR 运算符。 - PHRASE
-
启用用于搜索短语的
"
引号运算符。 - PRECEDENCE
-
启用
(
和)
运算符来控制运算符优先级。 - PREFIX
-
启用
*
前缀运算符。 - SLOP
-
在短语后启用
~N
运算符,其中N
是匹配词条之间允许的最大位置数。与NEAR
同义。 - WHITESPACE
启用空格作为分隔符。
fields
参数中的通配符和按字段提升编辑
response = client.search( body: { query: { simple_query_string: { query: 'Will Smith', fields: [ 'title', '*_name' ] } } } ) puts response
GET /_search { "query": { "simple_query_string" : { "query": "Will Smith", "fields": [ "title", "*_name" ] } } }
查询title
、first_name
和last_name
字段。
response = client.search( body: { query: { simple_query_string: { query: 'this is a test', fields: [ 'subject^3', 'message' ] } } } ) puts response
subject
字段的重要性是message
字段的三倍。
多位置词条编辑
默认情况下,
simple_query_string
查询解析器会为查询字符串中的每个多位置词条创建一个match_phrase
查询。例如,解析器会为多词同义词ny, new york
创建一个match_phrase
查询:
(ny OR ("new york"))
response = client.search( body: { query: { simple_query_string: { query: 'ny city', auto_generate_synonyms_phrase_query: false } } } ) puts 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
的文档。