文章目录
- 示例请求
- query_string 的顶级参数
- query
- default_field
- allow_leading_wildcard
- analyze_wildcard
- analyzer
- auto_generate_synonyms_phrase_query
- boost
- default_operator
- enable_position_increments
- fields
- fuzziness
- fuzzy_max_expansions
- fuzzy_prefix_length
- fuzzy_transpositions
- lenient
- max_determinized_states
- minimum_should_match
- quote_analyzer
- phrase_slop
- quote_field_suffix
- rewrite
- time_zone
- 说明
官方文档地址: Query string query
使用具有严格语法的解析器根据提供的查询字符串返回文档。
此查询使用一种语法来根据运算符(例如AND
或NOT
)解析和拆分提供的查询字符串。 然后,查询在返回匹配文档之前独立分析每个拆分文本。
您可以使用query_string
查询来创建包含通配符、跨多个字段的搜索等复杂搜索。 虽然用途广泛,但查询很严格,如果查询字符串包含任何无效语法,则会返回错误。
警告
因为它会为任何无效语法返回错误,所以我们不建议对搜索框使用query_string
查询。
如果您不需要支持查询语法,请考虑使用match
查询。 如果您需要查询语法的功能,请使用不那么严格的simple_query_string
查询。
示例请求
运行以下搜索时,query_string
查询将(new york city) OR (big apple)
拆分为两部分:new york city
和big apple
。 然后,content
字段的分析器在返回匹配文档之前独立地将每个部分转换为标记。 因为查询语法不使用空格作为运算符,所以new york city
按原样传递给分析器。
GET /_search
{
"query": {
"query_string": {
"query": "(new york city) OR (big apple)",
"default_field": "content"
}
}
}
query_string 的顶级参数
query
(必需,字符串)您希望解析并用于搜索的查询字符串。 请参阅下面的查询字符串语法。
default_field
(可选,字符串)如果查询字符串中未提供任何字段,则您希望搜索的默认字段。
默认为index.query.default_field
索引设置,默认值为*
。*
值提取所有符合术语查询条件的字段并过滤元数据字段。 如果未指定prefix
,则将所有提取的字段组合起来以构建查询。
在所有符合条件的字段中搜索不包括嵌套文档。 需要使用nested
查询来搜索那些文档。
对于具有大量字段的映射,在所有符合条件的字段中进行搜索可能代价高昂。
一次可以查询的字段数是有限制的。 它由index.query.bool.max_clause_count
搜索设置定义,默认为1024
。
allow_leading_wildcard
(可选,布尔值)如果为true
,通配符*
和?
允许作为查询字符串的第一个字符。 默认为true
。
analyze_wildcard
(可选,布尔值)如果为true
,查询会尝试分析查询字符串中的通配符项。 默认为false
。
analyzer
(可选,字符串)分析器用于将查询字符串中的文本转换为标记。 默认为default_field
映射的index-time
分析器。 如果未映射任何分析器,则使用索引的默认分析器。
auto_generate_synonyms_phrase_query
(可选,布尔值)如果为true
,则会自动为多词同义词创建匹配短语查询。 默认为true
。 有关示例,请参阅同义词和 query_string
查询。
boost
(可选,浮点数)用于降低或提高查询相关性分数的浮点数。 默认为1.0
。
Boost 默认值为1.0
。 0
到1.0
之间的 boost 值会降低相关性分数。 大于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
,则模糊匹配的编辑包括两个相邻字符的换位 (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 时区,用于将查询字符串中的日期值转换为 UTC。
有效值为 ISO 8601 UTC 偏移量,例如+01:00
或-08:00
,以及 IANA 时区 ID,例如America/Los_Angeles
。
注意
time_zone
参数不影响now
的日期数学值。now
始终是 UTC 中的当前系统时间。 但是,time_zone
参数会转换使用now
和日期数学四舍五入计算的日期。 例如,time_zone
参数将转换为now/d
。
说明
查询字符串语法
查询字符串“mini-language”由查询字符串和搜索 API 中的q
查询字符串参数使用。
查询字符串被解析为一系列术语和运算符。 一个术语可以是单个词 — quick
或brown
,也可以是一个短语,用双引号括起来 — "quick brown"
,它以相同的顺序搜索短语中的所有词。
运算符允许您自定义搜索,可用选项如下所述。
字段名
你可以在查询语法中指定要搜索的字段:
status
字段包含active
status:active
title
字段包含quick
或者brown
title:(quick OR brown)
author
字段包含确切的短语"john smith"
author:"John Smith"
first name
字段包含Alice
(注意我们需要用反斜杠转义空格)
first\ name:Alice
任意一个book.title
、book.content
或者book.date
包含quick
或brown
(注意我们需要用反斜杠转义*
)
book.\*:(quick OR brown)
字段title
有任何非空值
_exists_:title
通配符
通配符搜索可以在单个术语上运行,使用?
替换单个字符,和*
替换零个或多个字符:
qu?ck bro*
请注意通配符查询可能会使用大量的内存,并且执行得非常糟糕——只要想想需要查询多少项才能匹配查询字符串"a* b* c*"
即可。
警告
为了提高效率,将纯通配符\*
重写为已存在的查询。因此,通配符"field:*"
将匹配具有如下空值的文档:{ "field": "" }
如果字段缺失或设置为如下显式空值,则不匹配:
{ "field": null }
警告
允许通配符出现在单词的开头(如"*ing"
)是非常麻烦的,因为需要检查索引中的所有术语,以防它们匹配。可以通过将allow_leading_wildcard
设置为false
来禁用前导通配符。
只有部分在字符级操作的分析链被应用。例如,如果分析器同时执行小写和词干化,则只使用小写:在缺了一些字母的单词上进行词干提取是错误的。
通过将analyze_wildcard
设置为true,将分析以*
结尾的查询,并根据不同的标记构建布尔查询,确保第 N-1 标记的精确匹配,以及最后一个标记的前缀匹配。
正则表达式
正则表达式模式可以嵌入到查询字符串中,方法是用斜杠("/"
)括起来:
name:/joh?n(ath[oa]n)/
受支持的正则表达式语法在正则表达式语法中解释。
警告
allow_leading_wildcard
参数对正则表达式没有任何控制。以下查询字符串将强制 Elasticsearch 访问索引中的每一个项:/.*n/
请小心使用!
模糊
你可以使用~
操作符运行fuzzy
查询:
quikc~ brwn~ foks~
对于这些查询,查询字符串是规范化的。如果存在,则只应用分析仪的某些过滤器。有关适用过滤器的列表,请参见Normalizer。
该查询使用 Damerau-Levenshtein 距离来查找最大两个更改的所有术语,其中更改是单个字符的插入、删除或替换,或两个相邻字符的调换。
默认编辑距离为2
,但编辑距离为1
应该足以捕获 80% 的人工拼写错误。可以指定为:
quikc~1
警告
避免使用通配符混淆模糊
不支持混合模糊和通配符的操作。当混合时,其中一个操作符不适用。例如,您可以搜索app~1
(模糊)或app*
(通配符),但搜索app*~1
不应用模糊操作符(~1
)。
近似搜索
短语查询(例如"john smith"
)期望所有的词汇都以完全相同的顺序出现,而近似查询允许指定的单词以更大的距离或不同的顺序出现。就像模糊查询可以指定单词中字符的最大编辑距离一样,接近搜索允许我们指定短语中单词的最大编辑距离:
"fox quick"~5
字段中的文本越接近查询字符串中指定的原始顺序,就认为该文档越相关。与上面的示例查询相比,短语"quick fox"
会被认为比"quick brown fox"
更相关。
范围
可以为日期、数字或字符串字段指定范围。包含范围用方括号[min TO max]
指定,排他范围用花括号{min TO max}
指定。
2012 年的所有天:
date:[2012-01-01 TO 2012-12-31]
数字 1. .5:
count:[1 TO 5]
alpha
和omega
之间的标签,不包含alpha
和omega
:
tag:{alpha TO omega}
10 以上的数字:
count:[10 TO *]
在 2012 年之前的日期:
date:{* TO 2012-01-01}
花括号和方括号可以组合使用,从 1 到 5 的数字,但不包括 5:
count:[1 TO 5}
一侧无边界的范围可以使用以下语法:
age:>10
age:>=10
age:<10
age:<=10
注意
要用简化的语法组合上界和下界,需要用AND
操作符连接两个子句:age:(>=10 AND <20) age:(+>=10 +<20)
解析查询字符串中的范围可能很复杂,而且容易出错。使用显式range
查询要可靠得多。
Boosting
使用 boost 操作符^
使一个术语比另一个术语更相关。例如,如果我们想找到所有关于狐狸fox
的文档,但我们对敏捷的quick
狐狸特别感兴趣:
quick^2 fox
默认的boost
值是1
,但可以是任何正浮点数。0
到1
之间的boost
值降低相关性。
boost
也可以用于短语或组:
"john smith"^2 (foo bar)^4
布尔操作符
默认情况下,所有术语都是可选的,只要有一个术语匹配。搜索foo bar baz
会找到任何包含一个或多个foo
或bar
或baz
的文档。我们已经讨论了上面的default_operator
,它允许您强制要求所有的条件,但也有布尔操作符可以在查询字符串本身中使用,以提供更多的控制。
首选操作符是+
(必须存在此项)和-
(必须不存在此项)。所有其他术语都是可选的。例如,下面的查询:
quick brown +fox -news
- 必须存在
fox
- 必须不存在
news
quick
和brown
是可选的——它们的存在增加了相关性
也支持常见的布尔运算符AND
、OR
和NOT
(也包括&&
、||
和!
),但要注意,它们不遵守通常的优先规则,所以当多个运算符一起使用时,应该使用括号。例如,前面的查询可以重写为:
((quick AND fox) OR (brown AND fox) OR fox) AND NOT news
这个表单现在正确地复制了原始查询的逻辑,但是相关性评分与原始查询几乎没有相似之处。
相反,使用match
查询重写的相同查询看起来像这样:
{
"bool": {
"must": { "match": "fox" },
"should": { "match": "quick brown" },
"must_not": { "match": "news" }
}
}
分组
多个术语或子句可以用括号组合在一起,形成子查询:
(quick OR brown) AND fox
组可以用于针对特定字段,或用于提高子查询的结果:
status:(active OR pending) title:(full text search)^2
保留字符
如果您需要在查询本身中使用任何作为操作符的字符(而不是作为操作符),那么您应该用前导反斜杠转义它们。例如,要搜索(1+1)=2
,您需要将查询写为\(1\+1\)\=2
。当为请求体使用 JSON 时,两个前面的反斜杠(\\
)是必需的;反斜杠是 JSON 字符串中的保留转义字符。
GET /my-index-000001/_search
{
"query" : {
"query_string" : {
"query" : "kimchy\\!",
"fields" : ["user.id"]
}
}
}
保留字符为:+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
不能正确转义这些特殊字符可能会导致语法错误,从而阻止查询运行。
注意
<
和>
根本不能转义。防止它们尝试创建范围查询的唯一方法是从查询字符串中完全删除它们。
空格和空查询
空格不被视为操作符。
如果查询字符串为空或只包含空格,则查询将产生空结果集。
避免对嵌套文档使用 query_string 查询
query_string
搜索不返回嵌套文档。要搜索嵌套文档,请使用嵌套查询。
搜索多个字段
可以使用fields
参数跨多个字段执行query_string
搜索。
对多个字段运行query_string
查询的想法是将每个查询项扩展为 OR 子句,如下所示:
field1:query_term OR field2:query_term | ...
例如,下面的查询:
GET /_search
{
"query": {
"query_string": {
"fields": ["content", "name"],
"query": "this AND that"
}
}
}
匹配相同的单词:
GET /_search
{
"query": {
"query_string": {
"query": "(content:this OR name:this) AND (content:that OR name:that)"
}
}
}
由于从单个搜索项生成了几个查询,因此使用带有tie_breaker
的dis_max
查询自动完成了对它们的组合。例如(使用^5
表示name
被增强5
):
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name^5"],
"query" : "this AND that OR thus",
"tie_breaker" : 0
}
}
}
简单的通配符还可以用于搜索文档的特定内部元素。例如,如果我们有一个包含多个字段的city
对象(或包含多个字段的内部对象),我们可以自动搜索所有"city"
字段:
GET /_search
{
"query": {
"query_string" : {
"fields" : ["city.*"],
"query" : "this AND that OR thus"
}
}
}
另一种选择是在查询字符串本身中提供通配符字段搜索(正确转义*
符号),例如:city.\*:something
:
GET /_search
{
"query": {
"query_string" : {
"query" : "city.\\*:(this AND that OR thus)"
}
}
}
注意
因为\
(反斜杠)是 json 字符串中的一个特殊字符,它需要转义,因此在上面的query_string
中有两个反斜杠。
fields
参数还可以包括基于模式的字段名,允许自动扩展到相关字段(包括动态引入的字段)。例如:
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name.*^5"],
"query" : "this AND that OR thus"
}
}
}
多字段搜索的附加参数
当对多个字段运行query_string
查询时,支持以下附加参数。
type
(可选,字符串)确定查询如何匹配和评分文档。有效值:
- best_fields(默认)
查找匹配任何字段的文档,并使用来自任何匹配字段的最高_score
。参见best_fields
。 - bool_prefix
在每个字段上创建一个match_bool_prefix
查询,并组合每个字段的_score
。参见bool_prefix
。