首页 > 编程笔记 > 通用技能 阅读:3

Elasticsearch term和range查询(附带实例)

Elasticsearch 拥有一种专门的查询类型,叫做词项级查询,用于支持查询结构化数据。

数值、日期、范围、IP 地址等属于结构化文本类型。Elasticsearch 对待结构化数据和非结构化数据的方式有所不同:非结构化(全文)数据会被分析,而结构化字段则按原样存储。

回顾一下图书文档,看一下 edition、amazon_rating 和 release_date 字段:
"edition": 3,"amazon_rating": 4.7,"release_date": "2017-12-27",
当我们第一次索引文档时,由于我们没有预先创建索引,Elasticsearch 会通过分析字段的值来推断出模式。例如,edition 字段被表示为数值(非文本)字段,因此会被引擎推断为 long 数据类型。

按照类似的逻辑,amazon_rating 字段被确定为 float 数据类型,因为该字段包含小数。release_date 被确定为 date 数据类型,因为这个值以国际标准 ISO 8601 的日期格式(yyyy-MM-dd)表示。这 3 个字段都被归类为非文本(non-text)字段,这意味着它们的值不会被分词(不会被拆分成词元),也不会被归一化(没有同义词或词根),而是按原样存储。

词项级查询只会产生两种输出:如果查询与条件相匹配,则返回结果;否则,不返回任何结果。这些查询不考虑文档的匹配程度(相关性),而是专注于查询是否有匹配。由于不考虑相关性,因此词项级查询不会产生相关性分数。

term查询

term 查询用于获取与搜索条件中提供的值精确匹配的结果。例如,要获取所有第 3 版的书,我们可以编写一个 term 查询:
GET books/_search
{
  "_source": ["title","edition"],  ←---  在响应文档中只返回两个字段
  "query": {
    "term": {  ←---  声明这是一个词项级查询
      "edition": {  ←---  提供字段和值作为搜索条件
        "value": 3
      }
    }
  }
}
这个查询返回了所有第 3 版的书,我们的索引中只有 1 本书,如下所示:
"_score" : 1.0,
如果仔细观察结果你会发现,结果的默认分数是 1.0,就像我之前提到的,词项级查询并不关心相关性。

range查询

range 查询用于获取匹配某个范围的结果,例如获取从凌晨 1:00 到下午 1:00 之间的航班,或者找到年龄在 14 岁到 19 岁之间的青少年。range 查询是搜索范围数据的强大工具,可以应用于日期、数值和其他属性。

继续图书的例子。我们可以使用 range 查询来获取所有 amazon_rating 高于或等于 4.5 星且低于或等于 5 星的书:
GET books/_search
{
  "query": {
    "range": {  ←---  声明range查询
      "amazon_rating": {  ←---  匹配的范围
        "gte": 4.5,  ←---  gte:大于或等于
        "lte": 5  ←---  lte:小于或等于
      }
    }
  }
}
这个 range 查询将获取 3 本书,因为有 3 本书的评分高于或等于 4.5 星。

相关文章