全文查询
edit全文查询
edit全文查询使您能够搜索分析过的文本字段,例如电子邮件的正文。查询字符串使用与索引期间应用于该字段的相同分析器进行处理。
本组中的查询包括:
-
intervalsquery - 一个全文查询,允许对匹配词的顺序和接近度进行细粒度控制。
-
matchquery - 执行全文查询的标准查询,包括模糊匹配、短语查询或邻近查询。
-
match_bool_prefixquery -
创建一个
bool查询,将每个术语作为term查询进行匹配,除了最后一个术语,它作为prefix查询进行匹配 -
match_phrasequery -
类似于
match查询,但用于匹配精确短语或词组邻近匹配。 -
match_phrase_prefixquery -
类似于
match_phrase查询,但在最后一个词上进行通配符搜索。 -
multi_matchquery -
多字段版本的
match查询。 -
combined_fieldsquery - 匹配多个字段,就好像它们已经被索引到一个组合字段中一样。
-
query_stringquery - 支持紧凑的Lucene 查询字符串语法, 允许您在单个查询字符串中指定AND|OR|NOT条件和多字段搜索。仅适用于专家用户。
-
simple_query_stringquery -
一个更简单、更健壮的
query_string语法版本,适合直接暴露给用户。
区间查询
edit根据匹配词项的顺序和接近度返回文档。
The intervals query uses 匹配规则, constructed from a small set of
definitions. These rules are then applied to terms from a specified field.
这些定义生成了一系列最小的时间间隔,这些间隔跨越了文本主体中的术语。这些间隔可以由父源进一步组合和过滤。
示例请求
edit以下 intervals 搜索返回包含 my favorite food 且无间隔的文档,随后在 my_text 字段中包含 hot water 或 cold porridge。
此搜索将匹配 my_text 值为 my favorite food is cold
porridge,但不匹配 when it's cold my favorite food is porridge。
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"all_of" : {
"ordered" : true,
"intervals" : [
{
"match" : {
"query" : "my favorite food",
"max_gaps" : 0,
"ordered" : true
}
},
{
"any_of" : {
"intervals" : [
{ "match" : { "query" : "hot water" } },
{ "match" : { "query" : "cold porridge" } }
]
}
}
]
}
}
}
}
}
用于intervals的顶级参数
edit匹配规则参数
editThe match rule 匹配分析后的文本。
-
query -
(必需,字符串) 您希望在提供的
中查找的文本。 -
max_gaps -
(可选,整数) 匹配词之间的最大位置数。 超过此位置的词不被视为匹配。默认为
-1。如果未指定或设置为
-1,则匹配没有宽度限制。如果设置为0,则术语必须彼此相邻出现。 -
ordered -
(可选,布尔值)
如果为
true,匹配的术语必须按照指定的顺序出现。默认为false。 -
analyzer -
(可选,字符串) 用于分析
query中的术语的 分析器。 默认为顶层的分析器。 -
filter - (可选, 间隔过滤 规则对象) 一个可选的间隔过滤器。
-
use_field -
(可选,字符串) 如果指定,则匹配此字段中的区间,而不是顶级
。术语使用此字段的搜索分析器进行分析。这允许您跨多个字段进行搜索,就好像它们都是同一个字段一样;例如,您可以将相同的文本索引到词干化和非词干化字段中,并搜索词干化标记与非词干化标记相近的内容。
前缀 规则参数
edit规则 prefix 匹配以指定字符集开头的术语。
这个前缀可以扩展以匹配最多 indices.query.bool.max_clause_count
搜索设置 术语。如果前缀匹配更多术语,
Elasticsearch 将返回错误。您可以在字段映射中使用
index-prefixes 选项来避免此限制。
-
prefix -
(必需,字符串) 您希望在顶级
中找到的术语的起始字符。 -
analyzer -
(可选,字符串) 用于规范化
prefix的 分析器。 默认为顶层的分析器。 -
use_field -
(可选, 字符串) 如果指定, 则匹配此字段中的区间, 而不是顶级
。除非指定了单独的
analyzer,否则prefix会使用此字段的搜索分析器进行规范化。
通配符 规则参数
edit通配符规则使用通配符模式匹配术语。此模式最多可以扩展以匹配 indices.query.bool.max_clause_count
搜索设置 术语。如果模式匹配的术语更多,
Elasticsearch 将返回错误。
-
pattern -
(必需,字符串) 用于查找匹配项的通配符模式。
此参数支持两个通配符运算符:
-
?, 匹配任意单个字符 -
*, 可以匹配零个或多个字符,包括空字符
避免在模式的开头使用
*或?。这可能会增加查找匹配项所需的迭代次数,并降低搜索性能。 -
-
analyzer -
(可选,字符串) 用于规范化
pattern的分析器。 默认为顶层的分析器。 -
use_field -
(可选,字符串) 如果指定,匹配此字段中的区间,而不是顶级
。除非单独指定了
analyzer,否则pattern将使用此字段的搜索分析器进行规范化。
regexp 规则参数
editThe regexp rule 使用正则表达式模式匹配术语。
此模式最多可以扩展以匹配 indices.query.bool.max_clause_count
搜索设置 术语。
如果模式匹配的术语更多,Elasticsearch 将返回错误。
-
pattern -
(必需,字符串) 用于查找匹配项的正则表达式模式。
有关
regexp模式支持的运算符列表,请参阅 正则表达式语法。
避免使用通配符模式,例如 .* 或 .*?+`。这会增加查找匹配项所需的迭代次数并降低搜索性能。
-
analyzer -
(可选,字符串) 用于规范化
pattern的分析器。 默认为顶层的分析器。
-
use_field -
(可选,字符串) 如果指定,匹配此字段中的区间,而不是顶级
。除非单独指定了
analyzer,否则pattern将使用此字段的搜索分析器进行规范化。
模糊规则参数
editThe fuzzy rule matches terms that are similar to the provided term, within an
edit distance defined by Fuzziness. If the fuzzy expansion matches more than
indices.query.bool.max_clause_count
search setting terms, Elasticsearch returns an error.
-
term - (必需,字符串) 要匹配的术语
-
prefix_length -
(可选,整数)创建扩展时保留的前导字符数。默认为
0。 -
transpositions -
(可选,布尔值) 指示编辑是否包括两个相邻字符的转置(ab → ba)。默认为
true。 -
fuzziness -
(可选,字符串) 允许的最大编辑距离。有关有效值和更多信息,请参见模糊性。默认为
auto。 -
analyzer -
(可选,字符串) 用于规范化
term的分析器。 默认为顶层的分析器。 -
use_field -
(可选, 字符串) 如果指定, 匹配此字段中的区间而不是顶级
。除非单独指定了
analyzer,否则term会使用该字段的搜索分析器进行规范化。
range 规则参数
editThe range rule matches terms contained within a provided range.
This range can expand to match at most indices.query.bool.max_clause_count
搜索设置 terms.
If the range matches more terms,Elasticsearch returns an error.
-
gt - (可选,字符串) 大于:匹配大于所提供项的项。
-
gte - (可选,字符串) 大于或等于:匹配大于或等于所提供术语的术语。
-
lt - (可选, 字符串) 小于: 匹配小于所提供项的项。
-
lte - (可选, 字符串) 小于或等于: 匹配小于或等于所提供项的项。
必须提供 gt 或 gte 参数之一。
必须提供 lt 或 lte 参数之一。
-
analyzer -
(可选,字符串) 用于规范化
pattern的分析器。 默认为顶层的分析器。 -
use_field -
(可选,字符串) 如果指定,匹配此字段中的区间,而不是顶级
。
all_of 规则参数
edit规则 all_of 返回跨越其他规则组合的匹配项。
-
intervals - (必需,规则对象数组) 一个规则数组,用于组合。所有规则必须在文档中产生匹配,才能使整体源匹配。
-
max_gaps -
(可选,整数) 匹配词之间的最大位置数。由规则产生的间隔超过此值的将不被视为匹配。默认为
-1。如果未指定或设置为
-1,则匹配没有宽度限制。如果设置为0,则术语必须彼此相邻出现。 -
ordered -
(可选,布尔值) 如果为
true,则规则生成的区间应按指定顺序显示。默认为false。 -
filter - (可选,间隔过滤规则对象) 用于过滤返回间隔的规则。
any_of 规则参数
edit规则 any_of 返回其所有子规则生成的区间。
-
intervals - (必需,规则对象数组) 一个匹配规则的数组。
-
filter - (可选,间隔过滤规则对象) 用于过滤返回间隔的规则。
过滤规则参数
editThe filter rule 返回基于查询的时间间隔。请参阅 Filter example 示例。
-
after -
(可选,查询对象) 用于返回跟随在
filter规则中区间之后的区间。 -
before -
(可选,查询对象) 用于返回在
filter规则中的区间之前的区间的查询。 -
contained_by -
(可选,查询对象) 用于从
filter规则中返回包含在某个区间内的区间查询。 -
containing -
(可选,查询对象) 用于返回包含来自
filter规则的区间的查询。 -
not_contained_by -
(可选,查询对象) 用于返回不被
filter规则中的区间包含的区间。 -
not_containing -
(可选,查询对象) 用于返回不包含来自
filter规则的区间的查询。 -
not_overlapping -
(可选,查询对象) 用于返回与
filter规则中的区间不重叠的区间查询。 -
overlapping -
(可选,查询对象) 用于返回与
filter规则中的区间重叠的区间的查询。 -
script -
(可选, 脚本对象) 用于返回匹配文档的脚本。该脚本必须返回一个布尔值,
true或false。 参见 脚本过滤器 示例。
注释
edit过滤示例
edit以下搜索包含一个filter规则。它返回包含单词hot和porridge在彼此10个位置以内,且中间没有单词salty的文档:
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"max_gaps" : 10,
"filter" : {
"not_containing" : {
"match" : {
"query" : "salty"
}
}
}
}
}
}
}
}
脚本过滤器
edit您可以使用脚本来根据区间的起始位置、结束位置和内部间隙数量来过滤区间。以下filter脚本使用了interval变量及其start、end和gaps方法:
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"filter" : {
"script" : {
"source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
}
}
}
}
}
}
}
最小化
edit区间查询总是最小化区间,以确保查询可以在线性时间内运行。这有时会导致令人惊讶的结果,特别是在使用max_gaps限制或过滤器时。例如,考虑以下查询,搜索包含在短语hot porridge中的salty:
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "salty",
"filter" : {
"contained_by" : {
"match" : {
"query" : "hot porridge"
}
}
}
}
}
}
}
}
此查询不匹配包含短语 hot porridge is
salty porridge 的文档,因为匹配查询返回的 hot
porridge 的区间仅覆盖此文档中的前两个词,并且这些区间不与覆盖 salty 的区间重叠。
匹配查询
edit返回与提供的文本、数字、日期或布尔值匹配的文档。提供的文本在匹配之前会进行分析。
The match query 是执行全文搜索的标准查询,
包括模糊匹配的选项。
示例请求
editGET /_search
{
"query": {
"match": {
"message": {
"query": "this is a test"
}
}
}
}
用于 match 的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
query -
(必需) 您希望在提供的
中查找的文本、数字、布尔值或日期。The
matchquery 分析 任何提供的文本在执行搜索之前。这意味着matchquery 可以搜索text字段中的分析标记,而不是精确的术语。 -
analyzer -
(可选,字符串) 用于将
query值中的文本转换为标记的 分析器。默认为为映射的 索引时分析器。如果没有映射分析器,则使用索引的默认分析器。 -
auto_generate_synonyms_phrase_query -
(可选, 布尔值) 如果为
true, 则会自动为多词同义词创建匹配短语查询。默认为true。参见在匹配查询中使用同义词的示例。
-
boost -
(可选, 浮点数) 用于减少或增加查询的相关性分数的浮点数。默认为
1.0。Boost值相对于默认值
1.0是相对的。Boost值在0和1.0之间会降低相关性分数。大于1.0的值会增加相关性分数。 -
fuzziness - (可选,字符串) 允许的最大编辑距离进行匹配。有关有效值和更多信息,请参见模糊性。有关示例,请参见匹配查询中的模糊性。
-
max_expansions -
(可选,整数) 查询将扩展到的最大术语数量。默认为
50。 -
prefix_length -
(可选,整数) 用于模糊匹配的开始字符数保持不变。默认为
0。 -
fuzzy_transpositions -
(可选,布尔值) 如果为
true,模糊匹配的编辑包括两个相邻字符的转置(ab → ba)。默认为true。 -
fuzzy_rewrite -
(可选,字符串) 用于重写查询的方法。请参阅
rewrite参数以获取有效值和更多信息。如果
fuzziness参数不是0,match查询默认使用fuzzy_rewrite方法top_terms_blended_freqs_${max_expansions}。 -
lenient -
(可选,布尔值) 如果为
true,则忽略基于格式的错误,例如为 数值 字段提供文本query值。默认为false。 -
operator -
(可选,字符串) 用于解释
query值中文本的布尔逻辑。 有效值包括:-
OR(默认) -
例如,
query值为capital of Hungary时,解释为capital OR of OR Hungary。 -
AND -
例如,
query值为capital of Hungary时,解释为capital AND of AND Hungary。
-
-
minimum_should_match -
(可选, 字符串) 必须匹配的最小子句数,以便文档被返回。有关有效值和更多信息,请参阅
minimum_should_match参数。 -
zero_terms_query -
(可选,字符串) 指示当
analyzer移除所有标记时(例如使用stop过滤器),是否返回任何文档。有效值为:-
none(默认) -
如果
analyzer移除所有标记,则不返回任何文档。 -
all -
返回所有文档,类似于
match_all查询。
参见Zero terms query示例。
-
注释
edit简短请求示例
edit您可以通过结合和query参数来简化匹配查询语法。例如:
GET /_search
{
"query": {
"match": {
"message": "this is a test"
}
}
}
match查询的工作原理
editThe match query 是类型为 boolean 的查询。这意味着提供的文本会被分析,分析过程会从提供的文本中构造一个布尔查询。operator 参数可以设置为 or 或 and 来控制布尔子句(默认为 or)。可以通过使用 minimum_should_match 参数来设置匹配的最少可选 should 子句数量。
这里是一个使用operator参数的示例:
GET /_search
{
"query": {
"match": {
"message": {
"query": "this is a test",
"operator": "and"
}
}
}
}
可以设置analyzer来控制哪个分析器将对文本执行分析过程。它默认为字段的显式映射定义,或者默认的搜索分析器。
可以将 lenient 参数设置为 true 以忽略由数据类型不匹配引起的异常,例如尝试使用文本查询字符串查询数值字段。默认为 false。
匹配查询中的模糊性
editfuzziness 允许基于被查询字段类型的模糊匹配。
请参阅 Fuzziness 以了解允许的设置。
在这种情况下,可以设置 prefix_length 和 max_expansions 来控制模糊过程。如果设置了模糊选项,查询将使用 top_terms_blended_freqs_${max_expansions} 作为其 重写方法,fuzzy_rewrite 参数允许控制查询如何被重写。
模糊转置(ab → ba)默认情况下是允许的,但可以通过将fuzzy_transpositions设置为false来禁用。
模糊匹配不适用于具有同义词的术语或在分析过程中在同一位置生成多个标记的情况。在这些情况下,这些术语会被扩展为一种特殊的同义词查询,该查询会混合词频,但不支持模糊扩展。
GET /_search
{
"query": {
"match": {
"message": {
"query": "this is a testt",
"fuzziness": "AUTO"
}
}
}
}
零项查询
edit如果使用的分析器移除了查询中的所有标记,例如 stop 过滤器所做的那样,默认行为是匹配不到任何文档。为了改变这一点,可以使用 zero_terms_query 选项,该选项接受 none(默认)和 all,后者对应于 match_all 查询。
GET /_search
{
"query": {
"match": {
"message": {
"query": "to be or not to be",
"operator": "and",
"zero_terms_query": "all"
}
}
}
}
同义词
editThe match query supports multi-terms synonym expansion with the synonym_graph token filter. When this filter is used, the parser creates a phrase query for each multi-terms synonyms.
例如,以下同义词:"ny, new york" 将产生:
(ny OR ("纽约"))
也可以使用连词来匹配多词同义词:
GET /_search
{
"query": {
"match" : {
"message": {
"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。
匹配布尔前缀查询
edit一个 match_bool_prefix 查询会分析其输入并构建一个
bool 查询 从这些词项中。除了最后一个词项外,每个词项都用于一个 term 查询。最后一个词项则用于一个 prefix 查询。一个
match_bool_prefix 查询如
GET /_search
{
"query": {
"match_bool_prefix" : {
"message" : "quick brown f"
}
}
}
where analysis produces the terms quick, brown, and f is similar to the
following bool query
GET /_search
{
"query": {
"bool" : {
"should": [
{ "term": { "message": "quick" }},
{ "term": { "message": "brown" }},
{ "prefix": { "message": "f"}}
]
}
}
}
match_bool_prefix 查询与
match_phrase_prefix 的一个重要区别在于,
match_phrase_prefix 查询将其术语作为短语进行匹配,而
match_bool_prefix 查询可以在任何位置匹配其术语。上面的示例
match_bool_prefix 查询可以匹配包含
quick brown fox 的字段,但它也可以匹配 brown fox quick。它还可以
匹配包含术语 quick、术语 brown 以及以 f 开头的术语的字段,这些术语可以出现在任何位置。
参数
edit默认情况下,match_bool_prefix 查询的输入文本将使用查询字段的映射中的分析器进行分析。可以使用 analyzer 参数配置不同的搜索分析器。
GET /_search
{
"query": {
"match_bool_prefix": {
"message": {
"query": "quick brown f",
"analyzer": "keyword"
}
}
}
}
match_bool_prefix 查询支持
minimum_should_match 和 operator
参数,如
match 查询 中所述,将设置应用于构建的
bool 查询。构建的 bool 查询中的子句数量在大多数情况下将是查询文本分析生成的术语数量。
在匹配查询中的fuzziness、prefix_length、
max_expansions、fuzzy_transpositions 和 fuzzy_rewrite 参数可以
应用于为所有术语(但最终术语除外)构建的 term 子查询。它们对为最终术语构建的前缀查询没有任何影响。
匹配短语查询
editThe match_phrase query 分析文本并从分析后的文本创建一个 phrase query。例如:
GET /_search
{
"query": {
"match_phrase": {
"message": "this is a test"
}
}
}
短语查询匹配的词项可以在任意顺序下,最多允许配置的slop(默认为0)。交换位置的词项的slop为2。
可以设置analyzer来控制哪个分析器将对文本执行分析过程。它默认为字段的显式映射定义,或默认的搜索分析器,例如:
GET /_search
{
"query": {
"match_phrase": {
"message": {
"query": "this is a test",
"analyzer": "my_analyzer"
}
}
}
}
此查询也接受 zero_terms_query,如 match 查询 中所述。
匹配短语前缀查询
edit返回包含所提供文本中的单词的文档,这些单词按照相同的顺序排列。所提供文本的最后一个词被视为前缀,匹配以该词开头的任何单词。
示例请求
edit以下搜索返回在message字段中包含以quick brown f开头的短语的文档。
此搜索将匹配 message 值为 quick brown fox 或 two quick brown ferrets,但不匹配 the fox is quick and brown。
GET /_search
{
"query": {
"match_phrase_prefix": {
"message": {
"query": "quick brown f"
}
}
}
}
match_phrase_prefix 的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
query -
(必需,字符串) 您希望在提供的
中查找的文本。The
match_phrase_prefixquery 分析任何提供的文本为 标记,然后在执行搜索之前。该文本的最后一个词被视为 前缀,匹配以该词开头的任何单词。 -
analyzer -
(可选, 字符串) 用于将
query值中的文本转换为标记的 分析器。默认为为映射的 索引时分析器。如果没有映射分析器,则使用索引的默认分析器。 -
max_expansions -
(可选,整数) 最后一个提供的
query值将扩展到的最大术语数。默认为50。 -
slop -
(可选,整数) 匹配标记之间允许的最大位置数。
默认为
0。转置的词项的slop为2。 -
zero_terms_query -
(可选,字符串) 指示当
analyzer移除所有标记时(例如使用stop过滤器),是否返回任何文档。有效值为:-
none(默认) -
如果
analyzer移除所有标记,则不返回任何文档。 -
all -
返回所有文档,类似于
match_all查询。
-
注释
edit使用match phrase prefix查询进行搜索自动补全
edit虽然易于设置,但使用 match_phrase_prefix 查询进行搜索自动补全有时会产生令人困惑的结果。
例如,考虑查询字符串 quick brown f。这个查询通过将 quick 和 brown 创建为一个短语查询来工作(即术语 quick 必须存在并且必须紧随术语 brown)。然后它查看排序后的术语字典,找到以 f 开头的第一个50个术语,并将这些术语添加到短语查询中。
问题在于前50个词可能不包括词项fox,因此短语quick brown fox将不会被找到。这通常不是问题,因为用户将继续输入更多字母,直到他们要找的词出现。
为了获得更好的即搜即得解决方案,请参阅
completion suggester 和
search_as_you_type 字段类型。
组合字段
editThe combined_fields query 支持将多个文本字段的内容视为已索引到一个组合字段中进行搜索。该查询以输入字符串的词为中心视图:首先将查询字符串分析为单个词,然后在任何字段中查找每个词。当匹配可能跨越多个文本字段时,此查询特别有用,例如文章的 title、abstract 和 body:
GET /_search
{
"query": {
"combined_fields" : {
"query": "database systems",
"fields": [ "title", "abstract", "body"],
"operator": "and"
}
}
}
The combined_fields query 采用基于简单 BM25F 公式的原则性方法进行评分,该公式在
The Probabilistic Relevance Framework: BM25 and Beyond 中进行了描述。
在评分匹配时,查询将跨字段的术语和集合统计信息结合起来,将每个匹配项评分,就好像指定的字段已被索引到一个单一的组合字段中一样。这种评分是一种最佳尝试;combined_fields 做了一些近似处理,评分不会完全符合 BM25F 模型。
字段数量限制
默认情况下,查询包含的子句数量是有限制的。这个限制由
indices.query.bool.max_clause_count
设置定义,默认值为 4096。对于组合字段查询,子句的数量是字段数量乘以术语数量的结果。
按字段提升
edit字段提升是根据组合字段模型来解释的。例如,如果title字段的提升值为2,则得分计算为标题中的每个词在合成组合字段中出现两次。
GET /_search
{
"query": {
"combined_fields" : {
"query" : "distributed consensus",
"fields" : [ "title^2", "body" ]
}
}
}
The combined_fields query 要求字段提升值大于或等于 1.0。字段提升值允许为小数。
用于combined_fields的顶级参数
edit-
fields -
(必需,字符串数组) 要搜索的字段列表。支持字段通配符模式。仅支持
text字段,并且它们必须使用相同的搜索analyzer。 -
query -
(必需,字符串) 在提供的
中搜索的文本。The
combined_fieldsquery 分析 提供的文本在进行搜索之前。 -
auto_generate_synonyms_phrase_query -
(可选, 布尔值) 如果为
true, 则会自动为多词同义词创建匹配短语查询。默认为true。参见在匹配查询中使用同义词的示例。
-
operator -
(可选,字符串) 用于解释
query值中文本的布尔逻辑。 有效值包括:-
or(默认) -
例如,
query值为database systems时,解释为database OR systems。 -
and -
例如,
query值为database systems时,解释为database AND systems。
-
-
minimum_should_match -
(可选, 字符串) 必须匹配的最小子句数,以便文档被返回。有关有效值和更多信息,请参阅
minimum_should_match参数。 -
zero_terms_query -
(可选,字符串) 指示当
analyzer移除所有标记时(例如使用stop过滤器),是否返回任何文档。有效值为:-
none(默认) -
如果
analyzer移除所有标记,则不返回任何文档。 -
all -
返回所有文档,类似于
match_all查询。
参见Zero terms query示例。
-
与multi_match查询的比较
editThe combined_fields query 提供了一种跨多个 text 字段进行匹配和评分的原则性方法。为了支持这一点,它要求所有字段使用相同的搜索 analyzer。
如果你想要一个处理不同类型字段(如关键词或数字)的单一查询,那么multi_match查询可能更适合。它支持文本和非文本字段,并接受不共享相同分析器的文本字段。
主要的 multi_match 模式 best_fields 和 most_fields 采用了一种以字段为中心的查询视图。相比之下,combined_fields 是基于词项的:operator 和 minimum_should_match 是按词项应用的,而不是按字段应用的。具体来说,一个查询像
GET /_search
{
"query": {
"combined_fields" : {
"query": "database systems",
"fields": [ "title", "abstract"],
"operator": "and"
}
}
}
执行如下:
+(combined("database", fields:["title" "abstract"]))
+(combined("systems", fields:["title", "abstract"]))
换句话说,每个术语必须至少出现在一个字段中,文档才能匹配。
The cross_fields multi_match mode also takes a term-centric approach and
applies operator and minimum_should_match per-term. The main advantage of
combined_fields over cross_fields is its robust and interpretable approach
to scoring based on the BM25F algorithm.
多匹配查询
editThe multi_match query 基于 match query
来允许多字段查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "this is a test",
"fields": [ "subject", "message" ]
}
}
}
fields 和每个字段的提升
edit字段可以使用通配符指定,例如:
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
可以使用插入符号(^)符号来提升单个字段:
GET /_search
{
"query": {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ]
}
}
}
如果没有提供fields,multi_match查询默认使用index.query.default_field索引设置,该设置默认值为*。*提取映射中所有符合条件的字段,并过滤掉元数据字段。然后,所有提取的字段被组合起来构建查询。
字段数量限制
默认情况下,查询包含的子句数量是有限制的。这个限制由
indices.query.bool.max_clause_count
设置定义,默认值为 4096。对于多匹配查询,子句的数量是字段数量乘以术语数量的结果。
multi_match 查询的类型:
edit内部执行multi_match查询的方式取决于type参数,该参数可以设置为:
|
|
(默认) 查找在任何字段中匹配的文档,但使用最佳字段的 |
|
|
查找在任何字段中匹配的文档,并将每个字段的 |
|
|
将具有相同 |
|
|
在每个字段上运行一个 |
|
|
在每个字段上运行一个 |
|
|
在每个字段上创建一个 |
best_fields
edit当您在搜索多个最好在同一字段中找到的单词时,best_fields 类型最为有用。例如,在单个字段中的“brown fox”比在一个字段中的“brown”和另一个字段中的“fox”更有意义。
The best_fields type generates a match query for
each field and wraps them in a dis_max query, to
find the single best matching field. 例如,这个查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "brown fox",
"type": "best_fields",
"fields": [ "subject", "message" ],
"tie_breaker": 0.3
}
}
}
将执行为:
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "subject": "brown fox" }},
{ "match": { "message": "brown fox" }}
],
"tie_breaker": 0.3
}
}
}
通常,best_fields 类型使用匹配的 单个 最佳字段的分数,但如果指定了 tie_breaker,则它会按如下方式计算分数:
- 最佳匹配字段的得分
-
加上所有其他匹配字段的
tie_breaker * _score
此外,接受 analyzer、boost、operator、minimum_should_match、
fuzziness、lenient、prefix_length、max_expansions、fuzzy_rewrite、zero_terms_query、
auto_generate_synonyms_phrase_query 和 fuzzy_transpositions,
如 match query 中所述。
operator 和 minimum_should_match
The best_fields 和 most_fields 类型是 以字段为中心的 — 它们为每个字段生成一个 match 查询 每个字段。这意味着 operator 和 minimum_should_match 参数分别应用于每个字段,这可能不是你想要的。
以这个查询为例:
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"type": "best_fields",
"fields": [ "first_name", "last_name" ],
"operator": "and"
}
}
}
此查询执行方式如下:
(+first_name:will +first_name:smith) | (+last_name:will +last_name:smith)
换句话说,所有术语必须在单个字段中存在,文档才能匹配。
The combined_fields 查询提供了一种以术语为中心的方法,可以基于每个术语处理operator和minimum_should_match。另一种多匹配模式cross_fields也解决了这个问题。
most_fields
edit当查询多个包含以不同方式分析的相同文本的字段时,most_fields 类型最为有用。例如,主字段可能包含同义词、词干和无变音符号的词。第二个字段可能包含原始词,第三个字段可能包含短语组合。通过结合来自所有三个字段的分数,我们可以尽可能多地匹配主字段的文档,但使用第二个和第三个字段将最相似的结果推到列表的顶部。
这个查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown fox",
"type": "most_fields",
"fields": [ "title", "title.original", "title.shingles" ]
}
}
}
将执行为:
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "quick brown fox" }},
{ "match": { "title.original": "quick brown fox" }},
{ "match": { "title.shingles": "quick brown fox" }}
]
}
}
}
每个match子句的分数会被加在一起,就像一个bool查询一样。
此外,接受 analyzer、boost、operator、minimum_should_match、
fuzziness、lenient、prefix_length、max_expansions、fuzzy_rewrite 和 zero_terms_query。
phrase 和 phrase_prefix
editThe phrase 和 phrase_prefix 类型表现得就像 best_fields,
但它们使用 match_phrase 或 match_phrase_prefix 查询,而不是 match 查询。
这个查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown f",
"type": "phrase_prefix",
"fields": [ "subject", "message" ]
}
}
}
将被执行为:
GET /_search
{
"query": {
"dis_max": {
"queries": [
{ "match_phrase_prefix": { "subject": "quick brown f" }},
{ "match_phrase_prefix": { "message": "quick brown f" }}
]
}
}
}
此外,接受 analyzer、boost、lenient 和 zero_terms_query,如 Match 中所述,以及 slop,如 Match phrase 中所述。类型 phrase_prefix 还接受 max_expansions。
跨字段
editThe cross_fields 类型对于结构化文档特别有用,其中多个字段应该匹配。例如,当查询 first_name 和 last_name 字段以查找“Will Smith”时,最佳匹配很可能在一个字段中包含“Will”,在另一个字段中包含“Smith”。
处理这些类型查询的一种方法是将first_name和last_name字段索引到一个单独的full_name字段中。当然,这只能在索引时完成。
The cross_field 类型试图通过采用以词为中心的方法在查询时解决这些问题。它首先将查询字符串分析为单个词项,然后在任何字段中查找每个词项,就好像它们是一个大字段一样。
一个查询像:
GET /_search
{
"query": {
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "first_name", "last_name" ],
"operator": "and"
}
}
}
执行如下:
+(first_name:will last_name:will) +(first_name:smith last_name:smith)
换句话说,所有术语必须至少在一个字段中出现,文档才能匹配。(与此相比,用于best_fields和most_fields的逻辑。)
这解决了两个问题中的一个。不同词频的问题通过混合所有字段的词频来解决,以平衡这些差异。
在实践中,first_name:smith 将被视为具有与 last_name:smith 相同的频率,再加上一。这将使 first_name 和 last_name 上的匹配具有可比较的分数,last_name 由于是最可能包含 smith 的字段,因此具有微弱的优势。
请注意,cross_fields 通常只在所有字段都具有 boost 值为 1 的短字符串字段上才有用。否则,boost、词频和长度归一化会对分数产生影响,使得词统计信息的混合变得不再有意义。
如果你通过Validate运行上述查询,它会返回这个解释:
+blended("will", fields: [first_name, last_name])
+blended("smith", fields: [first_name, last_name])
同时,接受 analyzer、boost、operator、minimum_should_match、
lenient 和 zero_terms_query。
The cross_fields 类型以一种复杂的方式混合字段统计信息,可能难以解释。评分组合甚至可能不正确,特别是在某些文档包含部分搜索字段但不包含所有字段的情况下。您应考虑使用 combined_fields 查询作为替代方案,该查询也是基于词项的,但以一种更稳健的方式组合字段统计信息。
cross_field 和分析
editThe cross_field 类型只能在具有相同分析器的字段上以词为中心的模式工作。具有相同分析器的字段会像上面的例子一样分组在一起。如果有多个组,查询将使用任何组中的最佳分数。
例如,如果我们有一个first和last字段,它们使用相同的分析器,再加上一个first.edge和last.edge字段,它们都使用edge_ngram分析器,这个查询:
GET /_search
{
"query": {
"multi_match" : {
"query": "Jon",
"type": "cross_fields",
"fields": [
"first", "first.edge",
"last", "last.edge"
]
}
}
}
将被执行为:
blended("jon", fields: [first, last])
| (
blended("j", fields: [first.edge, last.edge])
blended("jo", fields: [first.edge, last.edge])
blended("jon", fields: [first.edge, last.edge])
)
换句话说,first 和 last 将被分组在一起并作为一个单一字段处理,而 first.edge 和 last.edge 也将被分组在一起并作为一个单一字段处理。
拥有多个组是可以的,但当与operator或minimum_should_match结合使用时,它可能会遇到与most_fields或best_fields相同的问题。
你可以轻松地将这个查询重写为两个独立的cross_fields查询,并通过dis_max查询将它们组合起来,并将minimum_should_match参数仅应用于其中一个:
GET /_search
{
"query": {
"dis_max": {
"queries": [
{
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "first", "last" ],
"minimum_should_match": "50%"
}
},
{
"multi_match" : {
"query": "Will Smith",
"type": "cross_fields",
"fields": [ "*.edge" ]
}
}
]
}
}
}
您可以通过在查询中指定analyzer参数,将所有字段强制分组到同一组中。
GET /_search
{
"query": {
"multi_match" : {
"query": "Jon",
"type": "cross_fields",
"analyzer": "standard",
"fields": [ "first", "last", "*.edge" ]
}
}
}
将执行为:
blended("will", fields: [first, first.edge, last.edge, last])
blended("smith", fields: [first, first.edge, last.edge, last])
tie_breaker
edit默认情况下,每个基于项的blended查询将使用组中任何字段返回的最佳分数。然后,在组合跨组的分数时,查询将使用任何组中的最佳分数。tie_breaker参数可以改变这两个步骤的行为:
|
|
从(例如) |
|
|
将 (例如) |
|
|
取单个最佳分数加上 |
bool_prefix
editThe bool_prefix 类型的评分行为类似于 most_fields,但使用的是
match_bool_prefix 查询 而不是
match 查询。
GET /_search
{
"query": {
"multi_match" : {
"query": "quick brown f",
"type": "bool_prefix",
"fields": [ "subject", "message" ]
}
}
}
在 match query 中解释的 analyzer、boost、operator、minimum_should_match、lenient、zero_terms_query 和 auto_generate_synonyms_phrase_query 参数是支持的。fuzziness、prefix_length、max_expansions、fuzzy_rewrite 和 fuzzy_transpositions 参数对于用于构建 term 查询的术语是支持的,但不会影响从最终术语构建的前缀查询。
该查询类型不支持slop参数。
查询字符串查询
edit本页面包含有关 query_string 查询类型的信息。有关在 Elasticsearch 中运行搜索查询的信息,请参阅 The search API。
基于提供的查询字符串返回文档,使用具有严格语法的解析器。
此查询使用一种语法来解析和分割提供的查询字符串,基于操作符,如AND或NOT。然后,查询在返回匹配文档之前,独立地分析每个分割的文本。
您可以使用 query_string 查询来创建一个复杂的搜索,其中包括通配符字符、跨多个字段的搜索等。虽然功能多样,但该查询是严格的,如果查询字符串包含任何无效语法,则会返回错误。
因为它对任何无效的语法都会返回错误,我们不建议在搜索框中使用query_string查询。
如果你不需要支持查询语法,可以考虑使用match查询。如果你需要查询语法的功能,可以使用simple_query_string查询,它不那么严格。
示例请求
edit当运行以下搜索时,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的顶级参数
edit-
query - (必需,字符串) 您希望解析并用于搜索的查询字符串。请参阅 查询字符串语法。
-
default_field -
(可选,字符串) 如果在查询字符串中没有提供字段,则使用此字段作为默认搜索字段。支持通配符 (
*)。默认为
index.query.default_field索引设置,其默认值为*。*值提取所有符合条件的字段进行术语查询并过滤元数据字段。如果没有指定prefix,则所有提取的字段将合并以构建查询。在所有符合条件的字段中进行搜索不包括嵌套文档。使用
嵌套查询来搜索这些文档。对于具有大量字段的映射,在所有符合条件的字段中进行搜索可能会很昂贵。
对一次查询的字段数乘以项数有限制。 它由
indices.query.bool.max_clause_count搜索设置定义。 -
allow_leading_wildcard -
(可选, 布尔值) 如果
true, 通配符字符*和?允许作为查询字符串的第一个字符。默认为true。 -
analyze_wildcard -
(可选,布尔值) 如果为
true,查询将尝试分析查询字符串中的通配符术语。默认为false。 -
analyzer -
(可选, 字符串) 用于将查询字符串中的文本转换为标记的分析器。默认为映射到
default_field的索引时分析器。如果没有映射分析器,则使用索引的默认分析器。 -
auto_generate_synonyms_phrase_query -
(可选,布尔值) 如果为
true,则会自动为多词同义词创建匹配短语查询。默认为true。 请参阅同义词和query_string查询的示例。 -
boost -
(可选, 浮点数) 用于减少或增加查询的相关性分数的浮点数。默认为
1.0。Boost值相对于默认值
1.0是相对的。Boost值在0和1.0之间会降低相关性分数。大于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 时区 用于将查询字符串中的
date值转换为 UTC。有效值是ISO 8601 UTC偏移量,例如
+01:00或-08:00,以及IANA时区ID,例如America/Los_Angeles。
注释
edit查询字符串语法
edit查询字符串“迷你语言”被用于
查询字符串以及
q查询字符串参数在搜索 API中。
查询字符串被解析成一系列的术语和操作符。一个术语可以是一个单独的词 — quick 或 brown — 或者是一个短语,用双引号包围 — "quick brown" — 它按顺序搜索短语中的所有单词。
运算符允许您自定义搜索——可用的选项如下所述。
字段名称
edit您可以在查询语法中指定要搜索的字段:
-
其中
status字段包含activestatus:active
-
其中
title字段包含quick或browntitle:(quick OR brown)
-
其中
author字段包含确切的短语"john smith"author:"John Smith"
-
其中
名字字段包含Alice(注意我们需要如何用反斜杠转义空格)first\ name:Alice
-
其中任何一个字段
book.title、book.content或book.date包含quick或brown(注意我们需要用反斜杠转义*):book.\*:(quick OR brown)
-
其中字段
title具有任何非空值:_exists_:title
通配符
edit通配符搜索可以在单个词上运行,使用 ? 替换单个字符,使用 * 替换零个或多个字符:
qu?ck bro*
请注意,通配符查询可能会使用大量内存并表现不佳——只需考虑匹配查询字符串 "a* b* c*" 需要查询多少个词项。
纯通配符 \* 会被重写为 exists 查询以提高效率。
因此,通配符 "field:*" 将匹配包含空值的文档,例如以下内容:
{
"field": ""
}
... 如果字段缺失或显式设置为空值,如下所示,则不会匹配:
{
"field": null
}
允许在单词的开头使用通配符(例如 "*ing")特别耗费资源,因为需要检查索引中的所有术语,以防它们匹配。可以通过将 allow_leading_wildcard 设置为 false 来禁用前导通配符。
仅对在字符级别操作的分析链部分进行应用。因此,例如,如果分析器同时执行小写转换和词干提取,则只会应用小写转换:对缺少某些字母的单词进行词干提取是错误的。
通过将 analyze_wildcard 设置为 true,以 * 结尾的查询将被分析,并根据确保前 N-1 个标记的精确匹配和最后一个标记的前缀匹配,构建出一个布尔查询。
正则表达式
edit正则表达式模式可以通过用正斜杠("/")包裹来嵌入到查询字符串中:
name:/joh?n(ath[oa]n)/
支持的正则表达式语法在正则表达式语法中进行了解释。
参数 allow_leading_wildcard 对正则表达式没有任何控制。像下面这样的查询字符串会强制 Elasticsearch 访问索引中的每个词条:
/.*n/
请谨慎使用!
模糊性
edit您可以使用~运算符运行模糊查询:
quikc~ brwn~ foks~
对于这些查询,查询字符串会被规范化。如果存在,只有分析器中的某些过滤器会被应用。有关适用的过滤器列表,请参阅规范化器。
该查询使用 Damerau-Levenshtein距离 来查找所有最多有两个更改的术语,其中更改是指插入、删除或替换单个字符,或交换两个相邻字符。
默认的编辑距离是2,但编辑距离为1应该足以捕捉到80%的所有人类拼写错误。它可以指定为:
quikc~1
邻近搜索
edit虽然短语查询(例如 "john smith")要求所有术语按完全相同的顺序排列,但邻近查询允许指定单词之间的距离更远或顺序不同。与模糊查询可以指定单词中字符的最大编辑距离一样,邻近搜索允许我们指定短语中单词的最大编辑距离:
"fox quick"~5
字段中的文本与查询字符串中指定的原始顺序越接近,该文档被认为越相关。与上述示例查询相比,短语 "quick fox" 比 "quick brown fox" 被认为更相关。
范围
edit日期、数值或字符串字段可以指定范围。包含范围使用方括号 [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 查询 更为可靠。
提升
edit使用boost操作符^来使一个词比另一个词更相关。
例如,如果我们想找到所有关于狐狸的文档,但我们特别感兴趣的是快速狐狸:
quick^2 fox
默认的 boost 值是 1,但可以是任何正浮点数。
介于 0 和 1 之间的提升值会降低相关性。
提升也可以应用于短语或组:
"john smith"^2 (foo bar)^4
布尔运算符
edit默认情况下,所有术语都是可选的,只要有一个术语匹配即可。搜索 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" }
}
}
分组
edit多个术语或子句可以用括号组合在一起,以形成子查询:
(quick OR brown) AND fox
组可以用于定位特定字段,或提升子查询的结果:
status:(active OR pending) title:(full text search)^2
保留字符
edit如果你需要在查询本身中使用任何作为运算符的字符(而不是作为运算符),那么你应该在它们前面加上反斜杠进行转义。例如,要搜索 (1+1)=2,你需要将查询写为 \(1\+1\)\=2。当使用 JSON 作为请求体时,需要两个前导反斜杠(\\);反斜杠是 JSON 字符串中的保留转义字符。
GET /my-index-000001/_search
{
"query" : {
"query_string" : {
"query" : "kimchy\\!",
"fields" : ["user.id"]
}
}
}
保留字符包括: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
未能正确转义这些特殊字符可能会导致语法错误,从而阻止您的查询运行。
< 和 > 根本无法转义。防止它们尝试创建范围查询的唯一方法是将它们从查询字符串中完全删除。
搜索多个字段
edit您可以使用 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"
}
}
}
多字段搜索的附加参数
edit当对多个字段运行 query_string 查询时,支持以下附加参数。
-
type -
(可选,字符串) 确定查询如何匹配和评分文档。有效值为:
-
best_fields(默认) -
查找匹配任何字段的文档,并使用任何匹配字段中的最高
_score。参见best_fields。 -
bool_prefix -
在每个字段上创建一个
match_bool_prefix查询,并结合每个字段的_score。参见bool_prefix。 -
cross_fields -
将具有相同
analyzer的字段视为一个大字段。在任何字段中查找每个单词。参见cross_fields。 -
most_fields -
查找匹配任何字段的文档,并结合每个字段的
_score。参见most_fields。 -
phrase -
在每个字段上运行一个
match_phrase查询,并使用最佳字段的_score。参见phrase和phrase_prefix。 -
phrase_prefix -
在每个字段上运行一个
match_phrase_prefix查询,并使用最佳字段的_score。参见phrase和phrase_prefix。
注意: 根据
type值,可能会有额外的顶级multi_match参数可用。 -
同义词和query_string查询
editThe query_string query supports multi-terms synonym expansion with the synonym_graph token filter. When this filter is used, the parser creates a phrase query for each multi-terms synonyms.
For example, the following synonym: ny, new york would produce:
(ny OR ("纽约"))
也可以使用连词来匹配多词同义词:
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。
minimum_should_match 的工作原理
editThe query_string 将查询按每个运算符分割,以创建整个输入的布尔查询。您可以使用 minimum_should_match 来控制结果查询中应匹配的“should”子句的数量。
GET /_search
{
"query": {
"query_string": {
"fields": [
"title"
],
"query": "this that thus",
"minimum_should_match": 2
}
}
}
上面的示例创建了一个布尔查询:
(title:this title:that title:thus)~2
匹配在单个字段 title 中至少包含两个术语 this、that 或 thus 的文档。
多个字段中minimum_should_match的工作原理
editGET /_search
{
"query": {
"query_string": {
"fields": [
"title",
"content"
],
"query": "this that thus",
"minimum_should_match": 2
}
}
}
上面的示例创建了一个布尔查询:
((内容:这个内容:那个内容:如此) | (标题:这个标题:那个标题:如此))
匹配在字段 title 和 content 上使用最大并集的文档。这里不能应用 minimum_should_match 参数。
GET /_search
{
"query": {
"query_string": {
"fields": [
"title",
"content"
],
"query": "this OR that OR thus",
"minimum_should_match": 2
}
}
}
添加显式运算符会强制将每个术语视为单独的子句。
上面的示例创建了一个布尔查询:
((内容:这个 | 标题:这个) (内容:那个 | 标题:那个) (内容:如此 | 标题:如此))~2
匹配至少满足三个“应该”子句中的两个的文档,每个子句由每个术语在字段上的析取最大值组成。
跨字段搜索中minimum_should_match的工作原理
edit在 type 字段中,cross_fields 值表示当输入被分析时,使用相同分析器的字段会被分组在一起。
GET /_search
{
"query": {
"query_string": {
"fields": [
"title",
"content"
],
"query": "this OR that OR thus",
"type": "cross_fields",
"minimum_should_match": 2
}
}
}
上面的示例创建了一个布尔查询:
(blended(terms:[field2:this, field1:this]) blended(terms:[field2:that, field1:that]) blended(terms:[field2:thus, field1:thus]))~2
匹配至少包含三个单项混合查询中两个的文档。
简单查询字符串查询
edit基于提供的查询字符串返回文档,使用具有有限但容错语法的解析器。
此查询使用简单语法来解析和 拆分提供的查询字符串为基于特殊操作符的术语。然后,查询 对每个术语独立进行分析,再返回匹配的 文档。
虽然它的语法比query_string查询更有限,但simple_query_string查询不会因无效语法而返回错误。相反,它会忽略查询字符串中的任何无效部分。
示例请求
editGET /_search
{
"query": {
"simple_query_string" : {
"query": "\"fried eggs\" +(eggplant | potato) -frittata",
"fields": ["title^5", "body"],
"default_operator": "and"
}
}
}
顶级参数为 simple_query_string
edit-
query - (必需,字符串) 您希望解析并用于搜索的查询字符串。请参阅 简单查询字符串语法。
-
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 -
(可选, 字符串) 附加到查询字符串中引用文本的后缀。
您可以使用此后缀来为精确匹配使用不同的分析方法。 请参阅混合精确搜索与词干提取。
注释
edit简单查询字符串语法
editThe simple_query_string 查询支持以下操作符:
-
+表示 AND 操作 -
|表示 OR 操作 -
-否定单个词项 -
"包裹多个词项以表示搜索短语 -
*在词项末尾表示前缀查询 -
(和)表示优先级 -
~N在单词后表示编辑距离(模糊性) -
~N在短语后表示偏离量
要按字面意思使用这些字符之一,请在其前面加上反斜杠(\)进行转义。
这些运算符的行为可能会根据default_operator的值而有所不同。例如:
GET /_search
{
"query": {
"simple_query_string": {
"fields": [ "content" ],
"query": "foo bar -baz"
}
}
}
此搜索旨在仅返回包含 foo 或 bar 且不包含 baz 的文档。然而,由于 default_operator 为 OR,此搜索实际上返回了包含 foo 或 bar 的文档以及任何不包含 baz 的文档。要按预期返回文档,请将查询字符串更改为 foo bar +-baz。
限制操作符
edit您可以使用 flags 参数来限制简单查询字符串语法支持的操作符。
要显式启用特定操作符,请使用 | 分隔符。例如,flags 值为 OR|AND|PREFIX 将禁用除 OR、AND 和 PREFIX 之外的所有操作符。
GET /_search
{
"query": {
"simple_query_string": {
"query": "foo | bar + baz*",
"flags": "OR|AND|PREFIX"
}
}
}
有效值
edit可用的标志有:
-
ALL(Default) - 启用所有可选操作符。
-
AND -
启用
+AND 运算符。 -
ESCAPE -
启用
\作为转义字符。 -
FUZZY -
启用单词后的
~N操作符,其中N是一个整数,表示匹配允许的编辑距离。参见 Fuzziness。 -
NEAR -
启用
~N运算符,其中N是允许匹配标记之间的最大位置数。与SLOP同义。 -
NONE - 禁用所有操作符。
-
NOT -
启用
-NOT 运算符。 -
OR -
启用
\|或运算符。 -
PHRASE -
启用用于搜索短语的
"引号运算符。 -
PRECEDENCE -
启用
(和)运算符来控制运算符优先级。 -
PREFIX -
启用
*前缀运算符。 -
SLOP -
启用
~N运算符,在短语之后,其中N是匹配标记之间允许的最大位置数。与NEAR同义。 -
WHITESPACE - 启用空白字符作为分隔符。
通配符和fields参数中的字段提升
edit字段可以使用通配符指定,例如:
GET /_search
{
"query": {
"simple_query_string" : {
"query": "Will Smith",
"fields": [ "title", "*_name" ]
}
}
}
可以使用插入符号(^)符号来提升单个字段:
多位置标记
edit默认情况下,simple_query_string 查询解析器会为查询字符串中的每个
多位置标记创建一个
match_phrase 查询。
例如,解析器会为多词同义词 ny, new york 创建一个 match_phrase 查询:
(ny OR ("纽约"))
要使用 AND 连接符匹配多位置标记,请将 auto_generate_synonyms_phrase_query 设置为 false:
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 的文档。