10、ES实战:词项查询

本学习笔记基于ElasticSearch 7.10版本,旧版本已经废弃的查询功能暂时不做笔记,以后有涉及到再做补充。
参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/term-level-queries.html

今一章,咱们来学习简单的词项查询,也就是 term 查询,以及以 term 延伸的词项查询。在之前的文章中,我们已经多次涉及到这个技能点,但是没有细讲,今天我们就来从头理一下 term 查询。

一、term

term 不会对查询字符进行分词,直接拿查询字符去倒排索引中比对。

GET books/_search
{
   
     
  "query": {
   
     
    "term": {
   
     
      "name": "java"
    }
  }
}

二、terms

使用多个关键字进行查询,参数为数组类型,关键字之间的关系为 OR 。

GET books/_search
{
   
     
  "query": {
   
     
    "terms": {
   
     
      "name": ["程序","设计","java"]
    }
  }
}

2.1、Terms lookup

terms 中除了简单的多个关键字查询,还支持 Terms lookup 查询,先查询获取已知文档的字段值,然后再将这些值用作关键字查询其他文档,有点类似于关系型数据库中的子查询,支持跨字段或者跨索引。

首先介绍一下 Terms lookup 的参数:

  • index : 必输,已知文档所在的索引。
  • id:必输,已知文档的ID。
  • path:必输,需要获取的文档字段值。
  • routing:选输,文档的路由值,如果在为文档建立索引时提供了自定义路由值,则此参数是必需的。

代码演示:

# 新建索引,添加一个文档,name 字段包含三个作者的名字
PUT author
PUT author/_doc/1
{
   
     
  "name": ["吴尧", "朱家雄", "朱彦鹏,罗晓辉,周勇"]
}
# 使用 author 索引中 id 为 1 的 name 字段值作为查询关键字
GET books/_search
{
   
     
  "query": {
   
     
    "terms": {
   
     
      "author": {
   
     
        "index": "author",
        "id": "1",
        "path": "name"
      }
    }
  }
}

注意:
默认情况下,Elasticsearch 将 terms 查询限制为最多65536个关键字,包括 Terms lookup 查询出来的关键字,可以通过 index.max_terms_count修改限制。

三、range

range 可以进行范围查询,按照日期范围、数字范围等查询。
range 中的主要参数:

  • gt : 大于。

  • gte:大于或等于。

  • lt:小于。

  • lte:小于或等于。

  • format:日期格式,如果不指定将使用 mapping 中定义日期格式。

  • relation:指定范围查询如何匹配 range 字段的值,可选值为:

  • INTERSECTS (默认值):将文档的范围字段值与查询范围相交。

  • CONTAINS:使用范围字段值完全包含查询范围的文档进行匹配。

  • WITHIN:使用范围字段值完全在查询范围内的文档进行匹配。

GET books/_search
{
   
     
  "query": {
   
     
    "range": {
   
     
      "price": {
   
     
        "gte": 10,
        "lte": 20
      }
    }
  },
  "sort": [
    {
   
     
      "price": {
   
     
        "order": "desc"
      }
    }
  ]
}

四、exists

exists 可以判断字段是否为空,可以指定多个字段,只返回指定字段中至少有一个非空值的文档:

# books 中不存在 amby 字段
GET books/_search
{
   
     
  "query": {
   
     
    "exists": {
   
     
      "field": "amby"
    }
  }
}

注意: 空字符串也是有值,null 才是空值。

五、prefix

prefix 用于前缀查询,效率略低,除非必要,一般不推荐使用。

GET books/_search
{
   
     
  "query": {
   
     
    "prefix": {
   
     
      "name": {
   
     
        "value": "大学"
      }
    }
  }
}

六、wildcard

wildcard 即通配符查询,支持单字符 ? 和多字符 *

# 查询所有姓张的作者的书
GET books/_search
{
   
     
  "query": {
   
     
    "wildcard": {
   
     
      "author": {
   
     
        "value": "张*"
      }
    }
  }
}
# 查询所有姓张并且名字只有两个字的作者的书
GET books/_search
{
   
     
  "query": {
   
     
    "wildcard": {
   
     
      "author": {
   
     
        "value": "张?"
      }
    }
  }
}

七、regexp

正则表达式查询:

# 查询所有姓张并且名字只有两个字的作者的书
GET books/_search
{
   
     
  "query": {
   
     
    "regexp": {
   
     
      "author": "张."
    }
  }
}

八、fuzzy

在实际搜索中,有时我们可能会打错字,从而导致搜索不到,在 match 全文查询中,可以通过 fuzziness 属性实现模糊查询。

而在词项查询中,就可以使用fuzzy 查询与搜索关键字相似的文档。
怎么样就算相似?以 LevenShtein 编辑距离为准。编辑距离是指将一个字符变为另一个字符所需要更改字符的次数,更改主要包括四种:

  • 更改字符 ( javb >> java )
  • 删除字符 ( javva >> java )
  • 插入字符 ( jaa >> java )
  • 转置字符 ( jaav >> java )

为了找到相似的词,模糊查询会在指定的编辑距离中创建搜索关键词的所有可能变化或者扩展的集合,然后进行搜索匹配。

GET books/_search
{
   
     
  "query": {
   
     
    "fuzzy": {
   
     
      "name": "javba"
    }
  }
}

九、ids

根据指定的 id 查询对应的文档。

GET books/_search
{
   
     
  "query": {
   
     
    "ids":{
   
     
      "values":  [1,2,3]
    }
  }
}

版权声明:

本文仅记录ElasticSearch学习心得,如有侵权请联系删除。
更多内容请访问原创作者:江南一点雨
*

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: