使用查询解析器来解析其内容的查询。下面是一个例子:
GET /_search
{
"query": {
"query_string" : {
"default_field" : "content",
"query" : "this AND that OR thus"
}
}
}
query_string查询解析输入并在运算符周围分割文本。每个文本部分彼此独立地分析。例如以下查询:
GET /_search
{
"query": {
"query_string" : {
"default_field" : "content",
"query" : "(new york city) OR (big apple)"
}
}
}
将分成new york city
或 big apple
,然后通过为该字段配置的分析器独立地分析每个部分。
空格不被视为运算符,这意味着new york city将“按原样”传递给为该字段配置的分析器。如果该字段是关键字字段,则分析器将创建单个术语new york city,并且查询构建器将在查询中使用此术语。如果要分别查询每个术语,则需要在术语周围添加显式运算符(例如new AND york AND city)
当提供多个字段时,也可以修改如何使用类型参数在每个文本部分内组合不同字段查询。这里描述了可能的模式,默认是Bestfield。query_string顶级参数包括:
参数 | 描述 |
---|---|
|
要解析的实际查询。参见查询字符串语法。 |
|
如果未指定前缀字段,则查询字词的默认字段。默认为 |
|
如果未指定显式运算符,则使用默认运算符。例如,使用默认运算符 |
|
用于分析查询字符串的分析器名称。 |
|
分析器的名称,用于分析查询字符串中的引用短语。对于这些部件,它将覆盖使用 |
|
设置时, |
|
设置为 |
|
控制模糊查询将扩展到的术语数。默认为 |
|
设置模糊查询的模糊性。默认为 |
|
设置模糊查询的前缀长度。默认是 |
|
设置为 |
|
设置短语的默认斜率。如果为零,则需要精确的短语匹配。默认值是 |
|
设置查询的提升值。默认为 |
|
默认为 |
|
默认情况下,不分析查询字符串中的通配符。通过将此值设置为 |
|
限制允许创建的regexp查询的自动机状态数。这可以防止太难(例如指数级硬)的regexp。默认为10000。 |
|
一个值,用于控制生成的布尔查询中应该匹配的“should”子句的数量。它可以是绝对值( |
|
如果设置为 |
|
时区应用于与日期相关的任何范围查询。另见 JODA时区。 |
|
附加到查询字符串的引用部分的字段的后缀。这允许使用具有不同分析链的字段进行精确匹配。看看这里为一个完整的例子。 |
|
是否应为多项同义词自动生成短语查询。默认为 |
|
[ |
在生成多项查询时,可以使用rewrite 参数控制如何重写它 。
如果未在查询字符串语法中明确指定要搜索的字段,index.query.default_field
则将使用该字段来派生要搜索的字段。如果index.query.default_field
未指定,query_string
则将自动尝试确定索引映射中可查询的现有字段,并对这些字段执行搜索。请注意,这不包括嵌套文档,使用嵌套查询来搜索这些文档。
该query_string
查询还可以运行针对多个领域。可以通过"fields"
参数提供字段(示例如下)。
field1:query_term OR field2:query_term | ...
query_string
针对多个字段运行查询的想法是将每个查询字词扩展为OR子句,如下所示:
例如,以下查询
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)"
}
}
}
由于从单个搜索项生成了多个查询,因此使用dis_max
带有tie_breaker 的查询自动组合它们。例如(name
使用^5
符号表示增强5 ):
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name^5"],
"query" : "this AND that OR thus",
"tie_breaker" : 0
}
}
}
简单通配符也可用于搜索文档的特定内部元素“内”。例如,如果我们有一个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
query_string
对多个字段运行查询时,允许使用以下附加参数:
参数 | 描述 |
---|---|
|
应如何组合字段以构建文本查询。有关完整示例,请参阅类型。默认为 |
参数 | 描述 |
---|---|
|
用于多场的分离最大连接断路器。默认为 |
fields参数还可以包括基于通配符字段名称,允许自动扩展到相关字段(包括动态引入的字段)。例如:
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name.*^5"],
"query" : "this AND that OR thus"
}
}
}
该query_string
查询支持使用synonym_graph标记过滤器进行多项同义词扩展。使用此过滤器时,解析器会为每个多项同义词创建一个短语查询。例如,以下同义词:"ny, new york" would produce:
(ny OR ("new york"))
也可以将多项同义词与连词相匹配:
GET /_search
{
"query": {
"query_string" : {
"default_field": "title",
"query" : "ny city",
"auto_generate_synonyms_phrase_query" : false
}
}
}
上面的例子创建了一个布尔查询:
(ny OR (new AND york)) city)
将文档与术语ny
或连词匹配new AND york
。默认情况下,参数auto_generate_synonyms_phrase_query
设置为true
。
查询字符串“迷你语言”由 查询字符串查询和API中的 q
查询字符串参数search
使用。
查询字符串被解析为一系列术语和运算符。术语可以是单个单词 - quick
或brown
- 或短语,由双引号括起来 - "quick brown"
以相同的顺序搜索短语中的所有单词。
操作员允许您自定义搜索 - 可用选项如下所述。
Field names
如查询字符串查询中所述default_field
,搜索搜索词,但可以在查询语法中指定其他字段:
其中status
字段包含active
status:active
其中title
字段包含quick
或brown
。如果省略OR运算符,将使用默认运算符
title:(quick OR brown)
title:(quick brown)
其中author
字段包含精确短语"john smith"
author:"John Smith"
其中任何字段book.title
,book.content
或book.date
包含 quick
或brown
(注意我们需要如何*
使用反斜杠转义):
book.\*:(quick brown)
该字段title
具有任何非null值:
_exists_:title
Wildcards 通配符
通配符搜索可以在单个术语上运行,使用?
替换单个字符,并*
替换零个或多个字符:
qu?ck bro *
请注意,通配符查询可能使用大量的内存,并且执行得很糟糕,只要想想需要查询多少项来匹配查询字符串“a*b*c*”。
纯通配符
\*
被重写为exists
查询效率。因此,通配符"field:*"
将匹配具有空值的文档,如下所示:````{“field”:“”}```... 如果字段丢失或使用显式空值设置则不匹配如下所示:```{`field“:null}```
允许在单词的开头(例如
"*ing"
)使用通配符特别重,因为需要检查索引中的所有术语,以防它们匹配。可以通过设置allow_leading_wildcard
为禁用前导通配符false
正则表达式模式可以通过将它们包装在forward-slashes("/"
)中嵌入查询字符串中:
name:/joh?n(ath[oa]n)/
正则表达式语法中解释了受支持的正则表达式语法。
该
allow_leading_wildcard
参数对正则表达式没有任何控制权。如下所示的查询字符串将强制Elasticsearch访问索引中的每个术语:/.*n/ 谨慎使用!
我们可以使用“fuzzy”运算符搜索与我们的搜索字词类似但不完全相同的字词:
quikc~ brwn~ foks~
它使用 Damerau-Levenshtein distance 来查找最多有两个变化的所有术语,其中一个变化是插入、删除或替换单个字符,或替换两个相邻字符。
默认编辑距离为2,但是编辑距离为1应该足以捕捉所有人类拼写错误的80%。它可以被指定为:
quikc~1
虽然短语查询(例如"john smith"
)期望所有术语具有完全相同的顺序,但是邻近查询允许指定的单词更远或者以不同的顺序。与模糊查询可以为单词中的字符指定最大编辑距离的方式相同,邻近搜索允许我们指定短语中单词的最大编辑距离:
"fox quick"~5
字段中的文本越接近查询字符串中指定的原始顺序,该文档被认为越相关。与上面的示例查询相比,该短语"quick fox"
将被视为更相关"quick brown fox"
。
可以为日期,数字或字符串字段指定范围。包含范围用方括号指定,[min TO max]
排他范围用大括号指定{min TO max}
。
All days in 2012:
date:[2012-01-01 TO 2012-12-31]
Numbers 1..5
count:[1 TO 5]
Tags between alpha
and omega
, excluding alpha
and omega
:
tag:{alpha TO omega}
Numbers from 10 upwards
count:[10 TO *]
Dates before 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
查询更加可靠。
使用boost运算符^
使一个术语比另一个术语更相关。例如,如果我们想要找到关于foxes的所有文档,但我们对quick foxes特别感兴趣:
quick^2 fox
默认boost
值为1,但可以是任何正浮点数。0到1之间的提升会降低相关性。
提升也可以应用于短语或群组:
"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
。
保留的字符是: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
无法正确转义这些特殊字符可能会导致语法错误,从而阻止您的查询运行。
根本无法转义。 阻止它们尝试创建范围查询的唯一方法是完全从查询字符串中删除它们。
如果查询字符串为空或仅包含空格,则查询将生成空结果集。