术语级查询

edit

您可以使用术语级查询来查找基于结构化数据中精确值的文档。结构化数据的示例包括日期范围、IP地址、价格或产品ID。

全文查询不同,术语级查询不会分析搜索词。相反,术语级查询匹配字段中存储的确切术语。

术语级查询仍然会规范化具有normalizer属性的keyword字段的搜索词。有关更多详细信息,请参阅normalizer

术语级查询的类型

edit
exists query
返回包含字段中任何索引值的文档。
fuzzy query
返回包含与搜索词相似的词的文档。Elasticsearch 使用 Levenshtein 编辑距离 来衡量相似性或模糊性。
ids query
根据文档的文档ID返回文档。
prefix query
返回在指定字段中包含特定前缀的文档。
range query
返回包含在指定范围内的术语的文档。
regexp query
返回包含与 正则表达式 匹配的术语的文档。
term query
返回在指定字段中包含精确术语的文档。
terms query
返回在指定字段中包含一个或多个精确术语的文档。
terms_set query
返回在指定字段中包含最少数量精确术语的文档。您可以使用字段或脚本来定义匹配术语的最小数量。
wildcard query
返回包含与通配符模式匹配的术语的文档。

存在查询

edit

返回包含字段索引值的文档。

由于各种原因,文档的字段可能不存在索引值:

  • 源JSON中的字段为null[]
  • 字段在映射中设置了"index" : false"doc_values" : false
  • 字段值的长度超过了映射中的ignore_above设置
  • 字段值格式错误,并且在映射中定义了ignore_malformed

示例请求

edit
GET /_search
{
  "query": {
    "exists": {
      "field": "user"
    }
  }
}

顶级参数为 exists

edit
field

(必需,字符串) 您希望搜索的字段名称。

当一个字段被认为不存在时,如果JSON值是null[],这些值将表明该字段确实存在:

  • 空字符串,例如 """-"
  • 包含 null 和另一个值的数组,例如 [null, "foo"]
  • 在字段映射中定义的自定义 null-value

注释

edit

查找缺少索引值的文档

edit

要查找缺少某个字段索引值的文档,请使用带有 exists 查询的 must_not 布尔查询

以下搜索返回缺少user.id字段索引值的文档。

GET /_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "user.id"
        }
      }
    }
  }
}

模糊查询

edit

返回包含与搜索词相似的词的文档,相似度由Levenshtein编辑距离衡量。

编辑距离是指将一个词项转换为另一个词项所需的一个字符变化的数量。这些变化可以包括:

  • 更改一个字符(box → fox)
  • 删除一个字符(black → lack)
  • 插入一个字符(sic → sick
  • 交换两个相邻字符(act → cat)

要查找相似的术语,fuzzy 查询会创建一组在指定编辑距离内的所有可能的变体或扩展。然后,查询会返回每个扩展的精确匹配。

示例请求

edit

简单示例

edit
GET /_search
{
  "query": {
    "fuzzy": {
      "user.id": {
        "value": "ki"
      }
    }
  }
}

使用高级参数的示例

edit
GET /_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返回文档。此查询使用存储在_id字段中的文档ID。

示例请求

edit
GET /_search
{
  "query": {
    "ids" : {
      "values" : ["1", "4", "100"]
    }
  }
}

用于ids的顶级参数

edit
values
(必需,字符串数组) 一个包含 文档ID 的数组。

前缀查询

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字段包含一个介于1020之间的术语。

GET /_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20,
        "boost": 2.0
      }
    }
  }
}

用于range的顶级参数

edit
<field>

(必需,对象)您希望搜索的字段。

参数为

edit
gt
(可选)大于。
gte
(可选)大于或等于。
lt
(可选) 小于。
lte
(可选) 小于或等于。
format

(可选, 字符串) 用于转换查询中日期值的日期格式。

默认情况下,Elasticsearch使用在映射中提供的日期格式。此值将覆盖该映射格式。

有关有效语法,请参阅format

如果格式或日期值不完整,范围查询会用默认值替换任何缺失的组件。请参阅缺失的日期组件

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 查询中的时区

time_zone 参数影响 now日期数学值。now 始终是UTC中的当前系统时间。

然而,time_zone 参数会转换使用 now 计算的日期以及 日期数学舍入。例如,time_zone 参数会 转换一个 now/d 的值。

boost

(可选, 浮点数) 用于减少或增加查询的 相关性分数的浮点数。默认为 1.0

您可以使用boost参数来调整包含两个或多个查询的搜索的相关性分数。

Boost值相对于默认值1.0是相对的。Boost值在01.0之间会降低相关性分数。大于1.0的值会增加相关性分数。

注释

edit

textkeyword 字段上使用 range 查询

edit

如果search.allow_expensive_queries设置为false,则不会执行对textkeyword字段的范围查询。

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"),该值将根据默认格式或设置的格式进行解析。

日期数学和舍入
edit

Elasticsearch 对参数中的 日期数学 值进行如下舍入:

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 时间。例如:

GET /_search
{
  "query": {
    "range": {
      "timestamp": {
        "time_zone": "+01:00",        
        "gte": "2020-01-01T00:00:00", 
        "lte": "now"                  
      }
    }
  }
}

表示date值使用UTC偏移量为+01:00

使用UTC偏移量为+01:00,Elasticsearch将此日期转换为2019-12-31T23:00:00 UTC

参数 time_zone 不影响 now 的值。

正则表达式查询

edit

返回包含与正则表达式匹配的术语的文档。

正则表达式是一种使用占位符字符(称为运算符)来匹配数据中模式的方法。有关regexp查询支持的运算符列表,请参阅正则表达式语法

示例请求

edit

以下搜索返回文档,其中user.id字段包含以k开头并以y结尾的任何术语。.*操作符匹配任意长度的任意字符,包括没有字符。匹配的术语可以包括kykaykimchy

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或用户名。

避免对text字段使用term查询。

默认情况下,Elasticsearch会在分析过程中更改text字段的值。这使得为text字段值找到精确匹配变得困难。

要搜索 text 字段值,请使用 match 查询。

示例请求

edit
GET /_search
{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "boost": 1.0
      }
    }
  }
}

用于term的顶级参数

edit
<field>
(必需, 对象) 您希望搜索的字段。

参数为

edit
value
(必需,字符串) 您希望在提供的 中查找的术语。要返回文档,术语必须与字段值完全匹配,包括空格和大小写。
boost

(可选, 浮点数) 用于减少或增加查询的 相关性分数的浮点数。默认为 1.0

您可以使用boost参数来调整包含两个或多个查询的搜索的相关性分数。

Boost值相对于默认值1.0是相对的。Boost值在01.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 查询可能会返回较差或没有结果。

要查看搜索结果的差异,请尝试以下示例。

  1. 创建一个包含名为 full_texttext 字段的索引。

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "full_text": { "type": "text" }
        }
      }
    }
  2. 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]

  3. 使用 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查询搜索没有返回任何结果。

  4. 使用 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字段中包含quickbrownfox标记的任何文档。

    以下是包含索引文档结果的 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 字段包含 kimchyelkbee

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值在01.0之间会降低相关性分数。大于1.0的值会增加相关性分数。

注释

edit

高亮显示 terms 查询

edit

高亮显示仅尽力而为。Elasticsearch 可能不会返回 terms 查询的高亮结果,具体取决于:

  • 高亮类型
  • 查询中的术语数量

术语查找

edit

术语查找获取现有文档的字段值。Elasticsearch然后使用这些值作为搜索词。这在搜索大量术语时非常有用。

要运行术语查找,字段的 _source 必须启用。您不能使用跨集群搜索在远程索引上运行术语查找。

默认情况下,Elasticsearch 将 terms 查询限制为最多 65,536 个词条。这包括使用词条查找获取的词条。您可以使用 index.max_terms_count 设置来更改此限制。

为了减少网络流量,如果可能的话,terms lookup 会从本地数据节点上的分片获取文档的值。如果您的 terms 数据不大,考虑使用一个具有单一主分片的索引,该索引在所有适用的数据节点上完全复制,以最小化网络流量。

要执行术语查找,请使用以下参数。

术语查找参数
edit
index
(必需,字符串)要从中获取字段值的索引名称。
id
(必需,字符串) 要从中获取字段值的文档的 ID
path

(必需,字符串) 要从中获取字段值的字段名称。Elasticsearch 使用这些值作为查询的搜索词。

如果字段值包含嵌套的内部对象数组,您可以使用点表示法语法访问这些对象。

routing
(可选,字符串) 自定义 路由值,用于从文档中获取术语值。如果在索引文档时提供了自定义路由值,则此参数是必需的。
术语查找示例
edit

要查看术语查找的工作原理,请尝试以下示例。

  1. 创建一个包含名为 colorkeyword 字段的索引。

    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "color": { "type": "keyword" }
        }
      }
    }
  2. 使用ID为1的文档,并在color字段中索引值为["blue", "green"]的文档。

    PUT my-index-000001/_doc/1
    {
      "color":   ["blue", "green"]
    }
  3. color字段中索引另一个ID为2且值为blue的文档。

    PUT my-index-000001/_doc/2
    {
      "color":   "blue"
    }
  4. 使用带有术语查找参数的 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++javaphp,用于求职者。你可以使用terms_set查询来返回至少匹配其中两种语言的文档。
  • 一个字段,permissions,包含了一个应用程序可能的用户权限列表。你可以使用terms_set查询来返回匹配这些权限子集的文档。

示例请求

edit

索引设置

edit

在大多数情况下,您需要在索引中包含一个数值字段映射,以使用terms_set查询。此数值字段包含返回文档所需的匹配词项数量。

要查看如何为 terms_set 查询设置索引,请尝试以下示例。

  1. 创建一个索引, job-candidates, 并使用以下字段映射:

    • name, 一个 keyword 字段。该字段包含求职者的姓名。
    • programming_languages, 一个 keyword 字段。该字段包含求职者已知的编程语言。
    • required_matches, 一个 数值 long 字段。该字段包含返回文档所需的匹配项数量。
    PUT /job-candidates
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "programming_languages": {
            "type": "keyword"
          },
          "required_matches": {
            "type": "long"
          }
        }
      }
    }
  2. 使用ID为1的文档并包含以下值:

    • Jane Smithname 字段中。
    • ["c++", "java"]programming_languages 字段中。
    • 2required_matches 字段中。

    包含 ?refresh 参数,以便文档可以立即用于搜索。

    PUT /job-candidates/_doc/1?refresh
    {
      "name": "Jane Smith",
      "programming_languages": [ "c++", "java" ],
      "required_matches": 2
    }
  3. 使用ID为2的另一个文档并包含以下值:

    • Jason Responsename 字段中。
    • ["java", "php"]programming_languages 字段中。
    • 2required_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_fieldrequired_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_fieldminimum_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结尾的术语。这些匹配的术语可以包括kiykitykimchy

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值在01.0之间会降低相关性分数。大于1.0的值会增加相关性分数。

case_insensitive [7.10.0] Added in 7.10.0.
(可选, 布尔值) 当设置为 true 时,允许模式与索引字段值进行不区分大小写的匹配。默认值为 false,这意味着匹配的区分大小写取决于底层字段的映射。
rewrite
(可选,字符串) 用于重写查询的方法。有关有效值和更多信息,请参阅 rewrite 参数
value

(必需,字符串) 通配符模式,用于在提供的 中查找您希望找到的术语。

此参数支持两个通配符运算符:

  • ?, 匹配任意单个字符
  • *, 可以匹配零个或多个字符,包括空字符

避免在模式的开头使用 *?。这可能会增加查找匹配项所需的迭代次数,并降低搜索性能。

wildcard
(必需,字符串) value 参数的别名。如果你同时指定了 valuewildcard,查询将使用请求体中的最后一个。

注释

edit

允许昂贵的查询

edit

如果 search.allow_expensive_queries 设置为 false,则不会执行通配符查询。