Term Level(术语) 查询操作的是存储在反向索引(倒排索引)中的准确词根,这些查询通常用于结构化数据,如数字、日期和枚举,而不是全文字段,无需进行分析(分词),Term Level查询类似于关系型数据库的(where条件过滤)。

Exists (存在) 非空查询

  返回在提供的字段中包含null或[]以外的值的文档。

请求实例


POST /moulds/_search
{
  "query": {
    "exists": {
      "field": "deleted_at"
    }
  }
}

顶级参数

field: ( 必填 , 字符串 ) 所要搜索的字段名称
   要返回文档,此字段必须存在且包含除null 或者 [] 以外的的值,这些值可包括:

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

备注

查找具有空值的文档

  为了找到只包含文件null值或[]在所提供的字段,使用 must_not 布尔查询与exists 查询


GET moulds/_search
{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "deleted_at"
                }
            }
        }
    }
}

Fuzzy 模糊查询

 返回包含与搜索词类似的词的文档。 由莱文斯坦距离测量。
 编辑距离是将一个术语转换为另一个术语所需的单个字符更改的数量。这些变化包括:

  • 改变一个字符 (box → fox)
  • 删除一个字符 (black → lack)
  • 插入一个字符 (sic → sick)
  • 转置两个相邻的字符 (act → cat)

请求示例

简单的例子

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

使用高级参数的例子

GET /_search
{
    "query": {
        "fuzzy": {
            "user": {
                "value": "ki",
                "fuzziness": "AUTO",
                "max_expansions": 50,
                "prefix_length": 0,
                "transpositions": true,
                "rewrite": "constant_score"
            }
        }
    }
}

顶级参数

<field>: ( 必需,对象)要搜索的字段

<field> 参数

  • value : (必填,字符串)您希望在提供的术语中找到术语的起始字符<field>
  • fuzziness : ( 可选,字符串)匹配所允许的最大编辑距离。有关 有效值和更多信息,请参见模糊性
  • max_expansions : (可选,整数)创建的最大变体数。默认为50。
    • 避免在max_expansions参数中使用高值,尤其是prefix_length参数值为0。max_expansions由于检查的变化很多,参数中的高值 会导致性能不佳。
  • prefix_length : (可选,整数)创建扩展时保持不变的起始字符数。默认为0。
  • transpositions : (可选,布尔值)指示编辑是否包含两个相邻字符的转置(ab→ba)。默认为true。
  • rewrite : (可选,字符串)用于重写查询的方法。有关有效值和更多信息,请参阅rewrite参数

IDs

 根据文档的IDs返回文档。此查询使用存储在_id字段中的文档IDs。

请求实例


GET moulds/_search
{
    "query": {
        "ids" : {
            "values" : ["100011", "100012", "100"]
        }
    }
}

顶级参数

<values>: ( 必填 , 字符串或数组 ) 所要搜索的文档编号

Prefix 前缀查询

  返回在提供的字段中包含特定前缀的文档。

请求示例

GET /moulds/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "美式"
      }
    }
  }
}

顶级参数

<field>: ( 必填 , 字符串 ) 所要搜索的字段名称

<field> 参数

  • value : (必填,字符串)您希望在提供的术语中找到术语的起始字符<field>
  • rewrite : ( 可选,字符串)用于重写查询的方法。有关有效值和更多信息,请参阅rewrite参数

Range 范围查询

  查询在所选范围内的文档

请求示例

搜索价格2030之间的文档


GET moulds/_search
{
    "query": {
        "range" : {
            "price": {
                "gte" : 20,
                "lte" : 30,
                "boost" : 2.0
            }
        }
    }
}

顶级参数

<field>: ( 必填 , 字符串 ) 所要搜索的字段名称

<field> 参数

  • gt : (可选) 大于
  • gte : (可选) 大于等于
  • lt: (可选) 小于
  • lte: (可选) 小于等于
  • format : ( 可选 , 字符串 ) 用于转换date查询中的值的日期格式
  • relation : ( 可选 , 字符串 ) 指示范围查询如何匹配range 字段的值
    • INTERSECTS (默认) : 匹配具有与查询范围相交的范围字段值的文档。
    • CONTAINS : 匹配具有完全包含查询范围的范围字段值的文档。
    • WITHIN : 匹配范围字段值完全在查询范围内的文档。
  • time_zone : ( 可选 ,字符串 ) 用于将查询中的值转换为UTC的date
  • boost : (可选,浮点)用于降低或增加查询的相关性分数的浮点数 。默认为1.0。

Date Math Expressions (日期数学表达式)

关键字(词) 含 义
now 当前时间
y
M
w
d
H / h 小时
m 分钟
s

备注

使用range 查询 date 字段

  当<field>参数是日期字段数据类型时,可以使用以下参数:gtgteltlte

   例如,下面的搜索返回的文档中,updated_at字段包含从今天到昨天之间的日期。


GET moulds/_search
{
    "query": {
        "range" : {
            "updated_at": {
                "gte": "now-1d/d", // 注意那个 T
                "lte": "now/d" 
            }
        }
    }
}

使用 time_zone 参数的 示例


GET moulds/_search
{

    "query": {
        "range" : {
            "updated_at": {
                "time_zone": "+08:00",  //这个地方是 你存储的数据增加 8小时后和下面的比较,也可以认为是 下面的时间减去上面的8小时
                "gte": "2019-09-10T16:43:38",  // 注意那个 T
                "lte": "now"  // 时区参数不影响now值。
            }
        }
    }
}
  • 表示 date 值使用UTC偏移量+08:00
  • 使用UTC偏移量+01:00,Elasticsearch会将此日期转换为 2019-09-10T08:43:38 UTC
  • time_zone参数不会影响该now值。

Regexp 正则表达式查询

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

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

请求示例

GET /moulds/_search
{
    "query": {
        "regexp": {
            "style": {
                "value": "bo*",
                "flags" : "ALL",
                "max_determinized_states": 10000,
                "rewrite": "constant_score"
            }
        }
    }
}

顶级参数

<field>: ( 必填 , 对象 ) 你要搜索的字段。

<field> 参数

  • value : (必需,字符串)您希望在提供的术语中找到的术语的正则表达式 <field>。有关支持的运算符的列表,请参阅正则表达式语法
  • flags : (可选,字符串)为正则表达式启用可选运算符。有关有效值和更多信息,请参阅正则表达式语法
  • max_determinized_states : (可选,整数) 查询所需的最大自动机状态数 。默认是10000。
  • rewrite : ( 可选,字符串)用于重写查询的方法。有关有效值和更多信息,请参阅rewrite参数

Term 术语查询

  返回在提供的字段中包含确切项的文档。
  可以使用term查询根据精确值(例如价格,产品ID或用户名)查找文档。

  • 避免使用字段term查询text
  • 默认情况下,Elasticsearch会更改text字段的值作为analysis的一部分。这可以使得text难以找到字段值的精确匹配。
  • 要搜索text字段值,请改用match查询。

请求实例

   查询价格是26的文档


GET moulds/_search
{
    "query": {
        "term": {
            "price": {
                "value": "26"
            }
        }
    }
}

顶级参数

<field>: ( 必填 , 对象 ) 你要搜索的字段。

<field> 参数

  • value :(必填,字符串)您希望在提供的术语中找到的索引词<field>。要返回文档,该索引词必须与字段值完全匹配,包括空格和大小写。
  • boost : ( 可选,浮点)用于降低或增加查询的相关性分数的浮点数 。默认为1.0。

备注

避免使用字段term查询text

 默认情况下,Elasticsearch会text在分析期间更改字段的值。例如,默认 standard analyzer (标准分析器) 更改 text字段值,如下所示:

  • 删除大多数标点符号
  • 将剩余内容划分为单个单词,称为tokens(词元)
  • 切分的单词、词元进行小写

 为了更好地搜索text字段,match查询还会在执行搜索之前分析您提供的搜索字词。这意味着match查询可以搜索text字段以查找 分析的标记,而不是精确的术语。
  该 term查询并没有analyze( 分析 )搜索词。该term查询只精确搜索您提供的值。这意味着term查询在搜索text字段时可能返回不同的或无结果。

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

    1. 使用text名为的字段创建索引full_text

PUT my_index
{
    "mappings" : {
        "properties" : {
            "full_text" : { "type" : "text" }
        }
    }
}
    1. 往索引中添加一个,值为Quick Brown Foxes!full_text字段
PUT my_index/_doc/1
{
  "full_text":   "Quick Brown Foxes!"
}
    1. 使用term查询Quick Brown Foxes!full_text字段中搜索。增加一个pretty 参数以使返回的结果更具可读性。
GET my_index/_search?pretty
{
  "query": {
    "term": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

   因为full_text 字段中并不包含Quick Brown Foxes! 这个索引词,所以term查询搜索不返回任何结果。

    1. 使用match查询Quick Brown Foxes!在full_text 字段中搜索
GET my_index/_search?pretty
{
  "query": {
    "match": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

   与 term 搜索不同 match 查询会分析您提供的搜索文本Quick Brown Foxes! 然后执行搜索,然后,match查询返回在full_text字段中包含quickbrownfox索引词的任何文档。
    下面是对结果中包含索引文档的匹配查询搜索的响应:

{
  "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",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.8630463,
        "_source" : {
          "full_text" : "Quick Brown Foxes!"
        }
      }
    ]
  }
}

Terms 多个术语查询

 返回在提供的字段中包含一个或多个确切术语的文档。每个term之间的关系是 OR(或者)

请求示例


GET moulds/_search
{
    "query": {
        "terms": {
            "price":["26","27"]
        }
    }
}

顶级参数

<field>: ( 必填 , 对象 ) 你要搜索的字段。
boost: ( 可选,浮点 ) 用于降低或增加查询的相关性分数的浮点数 。默认为1.0。

Terms Set 多个术语查询

 返回在提供的字段中包含最少数量的确切术语的文档。
该terms_set查询相同的terms 查询,但您可以定义返回文档所需的匹配项数。例如:

  • 有一个字段programming_languages包含已知的编程语言,如c++javaphp为求职者。您可以使用该terms_set查询返回与这些语言中至少两种语言匹配的文档。
  • 有一个字段permissions包含应用程序的可能用户权限列表。您可以使用该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、添加一条编号为1文档
    • name字段设置为Jane Smith
    • programming_languages 字段为 ["c++","java"]
    • required_matches字段为 2
PUT /job-candidates/_doc/1?refresh
{
    "name": "Jane Smith",
    "programming_languages": ["c++", "java"],
    "required_matches": 2
}
  • 3、添加一条编号为2文档
    • name字段设置为Jason Response
    • programming_languages 字段为 ["php","java"]
    • required_matches字段为 1
PUT /job-candidates/_doc/1?refresh
{
    "name": "Jason Response",
    "programming_languages": ["php", "java"],
    "required_matches": 1
}

测试请求

 搜索语言为c++,java, php

GET /job-candidates/_search
{
    "query": {
        "terms_set": {
            "programming_languages": {
                "terms": ["c++", "java", "php"],
                "minimum_should_match_field": "required_matches"
            }
        }
    }
}

返回结果:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.1005894,
    "hits" : [
      {
        "_index" : "job-candidates",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.1005894,
        "_source" : {
          "name" : "Jane Smith",
          "programming_languages" : [
            "c++",
            "java"
          ],
          "required_matches" : 2
        }
      },
      {
        "_index" : "job-candidates",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.1005894,
        "_source" : {
          "name" : "Jason Response",
          "programming_languages" : [
            "java",
            "php"
          ],
          "required_matches" : 1
        }
      }
    ]
  }
}
  • 第一条数据的匹配的数量是2个,语言c++,java在查询条件中,所以能匹配
  • 第二条数据匹配数量是1个,就是说,java或者是php 其中一个就可以,满足条件,所以能匹配

 搜索语言为c++,php

GET /job-candidates/_search
{
    "query": {
        "terms_set": {
            "programming_languages": {
                "terms": ["c++","php"],
                "minimum_should_match_field": "required_matches"
            }
        }
    }
}

返回结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8713851,
    "hits" : [
      {
        "_index" : "job-candidates",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.8713851,
        "_source" : {
          "name" : "Jason Response",
          "programming_languages" : [
            "java",
            "php"
          ],
          "required_matches" : 1
        }
      }
    ]
  }
}
  • 第一条数据的匹配的数量是2个,只有语言c++在查询条件中,所以不能匹配
  • 第二条数据匹配数量是1个,就是说,java或者是php 其中一个就可以,满足条件,所以能匹配

顶级参数

<field>: ( 必填 , 对象 ) 你要搜索的字段。

<field> 参数

  • terms :(必需,字符串数组) 您希望在提供的术语中找到的术语数组 <field>。要返回文档,所需数量的术语必须与字段值完全匹配,包括空格和大小写。
  • minimum_should_match_field : ( 可选,字符串)数字 字段,包含返回文档所需的匹配项数。
  • minimum_should_match_script : ( 可选,字符串)自定义脚本,包含返回文档所需的匹配项数。

备注

如何使用minimum_should_match_script参数编辑

您可以使用minimum_should_match_script脚本定义所需的匹配术语数。如果您需要动态设置所需术语的数量,这非常有用。

使用编辑的示例查询minimum_should_match_script

以下搜索返回该programming_languages字段至少包含以下两个术语的文档:
c++php

GET /job-candidates/_search
{
    "query": {
        "terms_set": {
            "programming_languages": {
                "terms": ["c++", "php"],
                "minimum_should_match_script": {
                   "source": "2"
                },
                "boost": 1.0
            }
        }
    }
}

没有匹配


参考资料