术语级查询
edit术语级查询
edit您可以使用术语级查询来查找基于结构化数据中精确值的文档。结构化数据的示例包括日期范围、IP地址、价格或产品ID。
与全文查询不同,术语级查询不会分析搜索词。相反,术语级查询匹配字段中存储的确切术语。
术语级查询仍然会规范化具有normalizer属性的keyword字段的搜索词。有关更多详细信息,请参阅normalizer。
术语级查询的类型
edit-
existsquery - 返回包含字段中任何索引值的文档。
-
fuzzyquery - 返回包含与搜索词相似的词的文档。Elasticsearch 使用 Levenshtein 编辑距离 来衡量相似性或模糊性。
-
idsquery - 根据文档的文档ID返回文档。
-
prefixquery - 返回在指定字段中包含特定前缀的文档。
-
rangequery - 返回包含在指定范围内的术语的文档。
-
regexpquery - 返回包含与 正则表达式 匹配的术语的文档。
-
termquery - 返回在指定字段中包含精确术语的文档。
-
termsquery - 返回在指定字段中包含一个或多个精确术语的文档。
-
terms_setquery - 返回在指定字段中包含最少数量精确术语的文档。您可以使用字段或脚本来定义匹配术语的最小数量。
-
wildcardquery - 返回包含与通配符模式匹配的术语的文档。
存在查询
edit返回包含字段索引值的文档。
由于各种原因,文档的字段可能不存在索引值:
-
源JSON中的字段为
null或[] -
字段在映射中设置了
"index" : false和"doc_values" : false -
字段值的长度超过了映射中的
ignore_above设置 -
字段值格式错误,并且在映射中定义了
ignore_malformed
示例请求
editGET /_search
{
"query": {
"exists": {
"field": "user"
}
}
}
顶级参数为 exists
edit-
field -
(必需,字符串) 您希望搜索的字段名称。
当一个字段被认为不存在时,如果JSON值是
null或[],这些值将表明该字段确实存在:-
空字符串,例如
""或"-" -
包含
null和另一个值的数组,例如[null, "foo"] -
在字段映射中定义的自定义
null-value
-
空字符串,例如
模糊查询
edit返回包含与搜索词相似的词的文档,相似度由Levenshtein编辑距离衡量。
编辑距离是指将一个词项转换为另一个词项所需的一个字符变化的数量。这些变化可以包括:
- 更改一个字符(box → fox)
- 删除一个字符(black → lack)
- 插入一个字符(sic → sick)
- 交换两个相邻字符(act → cat)
要查找相似的术语,fuzzy 查询会创建一组在指定编辑距离内的所有可能的变体或扩展。然后,查询会返回每个扩展的精确匹配。
示例请求
edit简单示例
editGET /_search
{
"query": {
"fuzzy": {
"user.id": {
"value": "ki"
}
}
}
}
使用高级参数的示例
editGET /_search
{
"query": {
"fuzzy": {
"user.id": {
"value": "ki",
"fuzziness": "AUTO",
"max_expansions": 50,
"prefix_length": 0,
"transpositions": true,
"rewrite": "constant_score_blended"
}
}
}
}
用于模糊查询的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
value -
(必需,字符串) 您希望在提供的
中查找的术语。 -
fuzziness - (可选,字符串) 允许的最大编辑距离。有关有效值和更多信息,请参见模糊性。
-
max_expansions -
(可选,整数) 创建的最大变体数量。默认为
50。避免在
max_expansions参数中使用高值,特别是当prefix_length参数值为0时。max_expansions参数中的高值可能会由于检查的变体数量过多而导致性能不佳。 -
prefix_length -
(可选,整数)创建扩展时保留的前导字符数。默认为
0。 -
transpositions -
(可选,布尔值) 指示编辑是否包括两个相邻字符的转置(ab → ba)。默认为
true。 -
rewrite -
(可选,字符串) 用于重写查询的方法。有关有效值和更多信息,请参阅
rewrite参数。
注释
edit如果 search.allow_expensive_queries 设置为 false,模糊查询将不会被执行。
ID
edit根据文档的ID返回文档。此查询使用存储在_id字段中的文档ID。
示例请求
editGET /_search
{
"query": {
"ids" : {
"values" : ["1", "4", "100"]
}
}
}
前缀查询
edit返回在指定字段中包含特定前缀的文档。
示例请求
edit以下搜索返回文档,其中 user.id 字段包含以 ki 开头的术语。
GET /_search
{
"query": {
"prefix": {
"user.id": {
"value": "ki"
}
}
}
}
顶级参数为 prefix
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
value -
(必需,字符串) 在提供的
中您希望找到的术语的起始字符。 -
rewrite -
(可选,字符串) 用于重写查询的方法。有关有效值和更多信息,请参阅
rewrite参数。 -
case_insensitive[7.10.0] Added in 7.10.0. - (可选,布尔值) 当设置为 true 时,允许在匹配索引字段值时进行 ASCII 不区分大小写的匹配。默认值为 false,这意味着匹配的区分大小写取决于底层字段的映射。
注释
edit简短请求示例
edit您可以通过结合prefix查询语法中的和value参数来简化查询。例如:
GET /_search
{
"query": {
"prefix" : { "user" : "ki" }
}
}
加速前缀查询
edit您可以使用index_prefixes映射参数来加速前缀查询。如果启用,Elasticsearch会根据配置设置在单独的字段中索引前缀。这使得Elasticsearch能够以更大的索引为代价更高效地运行前缀查询。
允许昂贵的查询
edit如果 search.allow_expensive_queries 设置为 false,前缀查询将不会执行。然而,如果启用了 index_prefixes,则会构建一个不被视为慢查询的优化查询,并且尽管有此设置,仍将执行该查询。
范围查询
edit返回包含在指定范围内的术语的文档。
示例请求
edit以下搜索返回文档,其中age字段包含一个介于10和20之间的术语。
GET /_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2.0
}
}
}
}
用于range的顶级参数
edit-
<field> -
(必需,对象)您希望搜索的字段。
参数为
edit-
relation -
(可选,字符串) 指示范围查询如何匹配
range字段的值。有效值包括:-
INTERSECTS(默认) - 匹配文档中范围字段的值与查询范围相交的文档。
-
CONTAINS - 匹配文档中范围字段的值完全包含查询范围的文档。
-
WITHIN - 匹配文档中范围字段的值完全在查询范围内的文档。
-
-
time_zone -
(可选,字符串) 协调世界时 (UTC) 偏移 或 IANA 时区 用于将查询中的
date值转换为 UTC。有效值是ISO 8601 UTC偏移量,例如
+01:00或-08:00,以及IANA时区ID,例如America/Los_Angeles。有关使用
time_zone参数的示例查询,请参见 在range查询中的时区。 -
boost -
(可选, 浮点数) 用于减少或增加查询的 相关性分数的浮点数。默认为
1.0。您可以使用
boost参数来调整包含两个或多个查询的搜索的相关性分数。Boost值相对于默认值
1.0是相对的。Boost值在0和1.0之间会降低相关性分数。大于1.0的值会增加相关性分数。
注释
edit在 text 和 keyword 字段上使用 range 查询
edit如果search.allow_expensive_queries设置为false,则不会执行对text或keyword字段的范围查询。
在date字段上使用range查询
edit当 参数是 date 字段数据类型时,您可以使用
日期数学 和以下参数:
-
gt -
gte -
lt -
lte
例如,以下搜索返回包含timestamp字段中日期介于今天和昨天之间的文档。
GET /_search
{
"query": {
"range": {
"timestamp": {
"gte": "now-1d/d",
"lte": "now/d"
}
}
}
}
缺失的日期组件
edit对于范围查询和日期范围聚合,Elasticsearch会用以下值替换缺失的日期组件。缺失的年份组件不会被替换。
MONTH_OF_YEAR: 01 DAY_OF_MONTH: 01 HOUR_OF_DAY: 23 MINUTE_OF_HOUR: 59 SECOND_OF_MINUTE: 59 NANO_OF_SECOND: 999_999_999
例如,如果格式是 yyyy-MM,Elasticsearch 会将 gt 值为 2099-12
转换为 2099-12-01T23:59:59.999_999_999Z。此日期使用提供的年份 (2099)
和月份 (12) 但使用默认的日期 (01)、小时 (23)、分钟 (59)、
秒 (59) 和纳秒 (999_999_999)。
数值日期范围值
edit当未指定日期格式且范围查询针对日期字段时,数值被解释为表示自纪元以来的毫秒数。如果您希望该值表示年份,例如2020年,您需要将其作为字符串值传递(例如"2020"),该值将根据默认格式或设置的格式进行解析。
日期数学和舍入
editElasticsearch 对参数中的 日期数学 值进行如下舍入:
-
gt -
向上舍入到不包含在舍入日期中的第一个毫秒。
例如,
2014-11-18||/M向上舍入到2014-12-01T00:00:00.000,排除了整个11月。 -
gte -
向下舍入到第一个毫秒。
例如,
2014-11-18||/M向下舍入到2014-11-01T00:00:00.000,包括整个月份。 -
lt -
向下舍入到舍入值之前的最后一个毫秒。
例如,
2014-11-18||/M向下舍入到2014-10-31T23:59:59.999,排除了整个11月。 -
lte -
向上舍入到舍入间隔中的最新毫秒。
例如,
2014-11-18||/M向上舍入到2014-11-30T23:59:59.999,包括整个月份。
使用time_zone参数的示例查询
edit您可以使用 time_zone 参数将 date 值转换为使用 UTC 偏移量的 UTC 时间。例如:
正则表达式查询
edit返回包含与正则表达式匹配的术语的文档。
正则表达式是一种使用占位符字符(称为运算符)来匹配数据中模式的方法。有关regexp查询支持的运算符列表,请参阅正则表达式语法。
示例请求
edit以下搜索返回文档,其中user.id字段包含以k开头并以y结尾的任何术语。.*操作符匹配任意长度的任意字符,包括没有字符。匹配的术语可以包括ky、kay和kimchy。
GET /_search
{
"query": {
"regexp": {
"user.id": {
"value": "k.*y",
"flags": "ALL",
"case_insensitive": true,
"max_determinized_states": 10000,
"rewrite": "constant_score_blended"
}
}
}
}
用于 regexp 的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
value -
(必需,字符串) 在提供的
中希望查找的正则表达式。有关支持的运算符列表,请参阅 正则表达式语法。默认情况下,正则表达式的长度限制为1,000个字符。您可以使用
index.max_regex_length设置来更改此限制。基于提供的正则表达式,
regexp查询的性能可能会有所不同。为了提高性能,避免在没有前缀或后缀的情况下使用通配符模式,例如.*或.*?+。 -
flags - (可选,字符串) 启用正则表达式的可选操作符。有关有效值和更多信息,请参阅 正则表达式语法。
-
case_insensitive[7.10.0] Added in 7.10.0. - (可选,布尔值) 当设置为 true 时,允许正则表达式值与索引字段值进行不区分大小写的匹配。默认值为 false,这意味着匹配的区分大小写取决于底层字段的映射。
-
max_determinized_states -
(可选, 整数) 查询所需的最大 自动机状态 数量。默认值为
10000。Elasticsearch 在内部使用 Apache Lucene 来解析正则表达式。Lucene 将每个正则表达式转换为一个包含多个确定状态的有限自动机。
您可以使用此参数来防止这种转换无意中消耗过多资源。您可能需要增加此限制以运行复杂的正则表达式。
-
rewrite -
(可选,字符串) 用于重写查询的方法。有关有效值和更多信息,请参阅
rewrite参数。
注释
edit允许昂贵的查询
edit如果 search.allow_expensive_queries 设置为 false,则不会执行正则表达式查询。
术语查询
edit返回在指定字段中包含精确术语的文档。
您可以使用 term 查询来查找基于精确值的文档,例如价格、产品ID或用户名。
示例请求
editGET /_search
{
"query": {
"term": {
"user.id": {
"value": "kimchy",
"boost": 1.0
}
}
}
}
用于term的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
value -
(必需,字符串) 您希望在提供的
中查找的术语。要返回文档,术语必须与字段值完全匹配,包括空格和大小写。 -
boost -
(可选, 浮点数) 用于减少或增加查询的 相关性分数的浮点数。默认为
1.0。您可以使用
boost参数来调整包含两个或多个查询的搜索的相关性分数。Boost值相对于默认值
1.0是相对的。Boost值在0和1.0之间会降低相关性分数。大于1.0的值会增加相关性分数。 -
case_insensitive[7.10.0] Added in 7.10.0. - (可选,布尔值) 当设置为 true 时,允许对值与索引字段值进行 ASCII 不区分大小写的匹配。默认值为 false,这意味着匹配的区分大小写取决于底层字段的映射。
注释
edit避免对text字段使用term查询
edit默认情况下,Elasticsearch在分析过程中会更改text字段的值。例如,默认的标准分析器会按如下方式更改text字段的值:
- 去除大部分标点符号
- 将剩余内容分割成单个单词,称为 tokens
- 将tokens转换为小写
为了更好地搜索 text 字段,match 查询在执行搜索之前也会分析您提供的搜索词。这意味着 match 查询可以搜索 text 字段中的分析后的词项,而不是精确的术语。
term 查询不会分析搜索词。term 查询只会搜索您提供的精确术语。这意味着在搜索 text 字段时,term 查询可能会返回较差或没有结果。
要查看搜索结果的差异,请尝试以下示例。
-
创建一个包含名为
full_text的text字段的索引。PUT my-index-000001 { "mappings": { "properties": { "full_text": { "type": "text" } } } } -
在
full_text字段中索引一个值为Quick Brown Foxes!的文档。PUT my-index-000001/_doc/1 { "full_text": "Quick Brown Foxes!" }因为
full_text是一个text字段,Elasticsearch 在分析过程中将Quick Brown Foxes!转换为[quick, brown, fox]。 -
使用
term查询在full_text字段中搜索Quick Brown Foxes!。包含pretty参数以便响应更易读。GET my-index-000001/_search?pretty { "query": { "term": { "full_text": "Quick Brown Foxes!" } } }因为
full_text字段不再包含精确的术语Quick Brown Foxes!,所以term查询搜索没有返回任何结果。 -
使用
match查询在full_text字段中搜索Quick Brown Foxes!。GET my-index-000001/_search?pretty { "query": { "match": { "full_text": "Quick Brown Foxes!" } } }与
term查询不同,match查询会在执行搜索之前分析您提供的搜索词,Quick Brown Foxes!。然后,match查询会返回 在full_text字段中包含quick、brown或fox标记的任何文档。以下是包含索引文档结果的
match查询搜索的响应。{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 0.8630463, "hits" : [ { "_index" : "my-index-000001", "_id" : "1", "_score" : 0.8630463, "_source" : { "full_text" : "Quick Brown Foxes!" } } ] } }
术语查询
edit返回在指定字段中包含一个或多个精确术语的文档。
terms 查询与 term 查询 相同,
只不过您可以搜索多个值。如果文档包含至少一个术语,它就会匹配。要搜索包含多个匹配术语的文档,请使用 terms_set 查询。
示例请求
edit以下搜索返回文档,其中 user.id 字段包含 kimchy 或 elkbee。
GET /_search
{
"query": {
"terms": {
"user.id": [ "kimchy", "elkbee" ],
"boost": 1.0
}
}
}
用于terms的顶级参数
edit-
<field> -
(可选,对象)您希望搜索的字段。
此参数的值是一个您希望在提供的字段中查找的术语数组。要返回一个文档,必须有一个或多个术语完全匹配字段值,包括空格和大小写。
默认情况下,Elasticsearch 将
terms查询限制为最多 65,536 个词条。您可以使用index.max_terms_count设置来更改此限制。要使用现有文档的字段值作为搜索词,请使用terms lookup参数。
-
boost -
(可选, 浮点数) 用于减少或增加查询的 相关性分数的浮点数。默认为
1.0。您可以使用
boost参数来调整包含两个或多个查询的搜索的相关性分数。Boost值相对于默认值
1.0是相对的。Boost值在0和1.0之间会降低相关性分数。大于1.0的值会增加相关性分数。
注释
edit术语查找
edit术语查找获取现有文档的字段值。Elasticsearch然后使用这些值作为搜索词。这在搜索大量术语时非常有用。
要运行术语查找,字段的 _source 必须启用。您不能使用跨集群搜索在远程索引上运行术语查找。
默认情况下,Elasticsearch 将 terms 查询限制为最多 65,536 个词条。这包括使用词条查找获取的词条。您可以使用 index.max_terms_count 设置来更改此限制。
为了减少网络流量,如果可能的话,terms lookup 会从本地数据节点上的分片获取文档的值。如果您的 terms 数据不大,考虑使用一个具有单一主分片的索引,该索引在所有适用的数据节点上完全复制,以最小化网络流量。
要执行术语查找,请使用以下参数。
术语查找参数
edit术语查找示例
edit要查看术语查找的工作原理,请尝试以下示例。
-
创建一个包含名为
color的keyword字段的索引。PUT my-index-000001 { "mappings": { "properties": { "color": { "type": "keyword" } } } } -
使用ID为1的文档,并在
color字段中索引值为["blue", "green"]的文档。PUT my-index-000001/_doc/1 { "color": ["blue", "green"] } -
在
color字段中索引另一个ID为2且值为blue的文档。PUT my-index-000001/_doc/2 { "color": "blue" } -
使用带有术语查找参数的
terms查询来查找包含与文档 2 相同的一个或多个术语的文档。包含pretty参数,以便响应更具可读性。GET my-index-000001/_search?pretty { "query": { "terms": { "color" : { "index" : "my-index-000001", "id" : "2", "path" : "color" } } } }因为文档2和文档1在
color字段中都包含blue作为值,Elasticsearch返回了这两个文档。{ "took" : 17, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 2, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "my-index-000001", "_id" : "1", "_score" : 1.0, "_source" : { "color" : [ "blue", "green" ] } }, { "_index" : "my-index-000001", "_id" : "2", "_score" : 1.0, "_source" : { "color" : "blue" } } ] } }
术语集查询
edit返回在指定字段中包含最少数量精确术语的文档。
The terms_set query与terms查询相同,只是您可以定义返回文档所需的匹配项数量。例如:
-
一个字段,
programming_languages,包含了一个已知的编程语言列表,例如c++、java或php,用于求职者。你可以使用terms_set查询来返回至少匹配其中两种语言的文档。 -
一个字段,
permissions,包含了一个应用程序可能的用户权限列表。你可以使用terms_set查询来返回匹配这些权限子集的文档。
示例请求
edit索引设置
edit在大多数情况下,您需要在索引中包含一个数值字段映射,以使用terms_set查询。此数值字段包含返回文档所需的匹配词项数量。
要查看如何为 terms_set 查询设置索引,请尝试以下示例。
-
创建一个索引,
job-candidates, 并使用以下字段映射:PUT /job-candidates { "mappings": { "properties": { "name": { "type": "keyword" }, "programming_languages": { "type": "keyword" }, "required_matches": { "type": "long" } } } } -
使用ID为
1的文档并包含以下值:-
Jane Smith在name字段中。 -
["c++", "java"]在programming_languages字段中。 -
2在required_matches字段中。
包含
?refresh参数,以便文档可以立即用于搜索。PUT /job-candidates/_doc/1?refresh { "name": "Jane Smith", "programming_languages": [ "c++", "java" ], "required_matches": 2 } -
-
使用ID为
2的另一个文档并包含以下值:-
Jason Response在name字段中。 -
["java", "php"]在programming_languages字段中。 -
2在required_matches字段中。
PUT /job-candidates/_doc/2?refresh { "name": "Jason Response", "programming_languages": [ "java", "php" ], "required_matches": 2 } -
你现在可以使用 required_matches 字段值作为在 terms_set 查询中返回文档所需的匹配词项数量。
示例查询
edit以下搜索返回文档,其中 programming_languages 字段包含以下至少两个术语:
-
c++ -
java -
php
The minimum_should_match_field 是 required_matches。这意味着所需的匹配项数量是 2,即 required_matches 字段的值。
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": [ "c++", "java", "php" ],
"minimum_should_match_field": "required_matches"
}
}
}
}
用于terms_set的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
terms -
(必需,字符串数组) 您希望在提供的
中查找的术语数组。要返回文档,必须有指定数量的术语完全匹配 字段值,包括空格和大小写。匹配项所需的数量在
minimum_should_match_field或minimum_should_match_script参数中定义。 -
minimum_should_match_field - (可选,字符串) 包含返回文档所需匹配项数量的数值字段。
-
minimum_should_match_script -
(可选, 字符串) 包含返回文档所需匹配项数量的自定义脚本。
有关参数和有效值,请参阅脚本。
有关使用
minimum_should_match_script参数的示例查询,请参阅 如何使用minimum_should_match_script参数。
注释
edit如何使用minimum_should_match_script参数
edit您可以使用 minimum_should_match_script 来定义使用脚本所需的匹配词项数量。如果您需要动态设置所需的词项数量,这非常有用。
使用 minimum_should_match_script 的示例查询
edit以下搜索返回文档,其中 programming_languages 字段包含以下至少两个术语:
-
c++ -
java -
php
此查询的 source 参数表示:
-
所需匹配的词条数量不能超过
params.num_terms,即terms字段中提供的词条数量。 -
所需匹配的词条数量是
2,即required_matches字段的值。
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": [ "c++", "java", "php" ],
"minimum_should_match_script": {
"source": "Math.min(params.num_terms, doc['required_matches'].value)"
},
"boost": 1.0
}
}
}
}
通配符查询
edit返回包含与通配符模式匹配的术语的文档。
通配符运算符是一个占位符,可以匹配一个或多个字符。例如,* 通配符运算符可以匹配零个或多个字符。您可以将通配符运算符与其他字符组合,以创建一个通配符模式。
示例请求
edit以下搜索返回文档,其中user.id字段包含以ki开头并以y结尾的术语。这些匹配的术语可以包括kiy、kity或kimchy。
GET /_search
{
"query": {
"wildcard": {
"user.id": {
"value": "ki*y",
"boost": 1.0,
"rewrite": "constant_score_blended"
}
}
}
}
用于wildcard的顶级参数
edit-
<field> - (必需, 对象) 您希望搜索的字段。
参数为
edit-
boost -
(可选, 浮点数) 用于减少或增加查询的 相关性分数的浮点数。默认为
1.0。您可以使用
boost参数来调整包含两个或多个查询的搜索的相关性分数。Boost值相对于默认值
1.0是相对的。Boost值在0和1.0之间会降低相关性分数。大于1.0的值会增加相关性分数。 -
case_insensitive[7.10.0] Added in 7.10.0. - (可选, 布尔值) 当设置为 true 时,允许模式与索引字段值进行不区分大小写的匹配。默认值为 false,这意味着匹配的区分大小写取决于底层字段的映射。
-
rewrite -
(可选,字符串) 用于重写查询的方法。有关有效值和更多信息,请参阅
rewrite参数。 -
value -
(必需,字符串) 通配符模式,用于在提供的
中查找您希望找到的术语。此参数支持两个通配符运算符:
-
?, 匹配任意单个字符 -
*, 可以匹配零个或多个字符,包括空字符
避免在模式的开头使用
*或?。这可能会增加查找匹配项所需的迭代次数,并降低搜索性能。 -
-
wildcard -
(必需,字符串)
value参数的别名。如果你同时指定了value和wildcard,查询将使用请求体中的最后一个。
注释
edit允许昂贵的查询
edit如果 search.allow_expensive_queries 设置为 false,则不会执行通配符查询。