• Elasticsearch7教程(3) 查询文档 term terms terms_set


    版本约定

    本系列博客ES版本如下:

    • Elasticsearch 7.17.X
    • Spring Data Elasticsearch 4.4.X

    Elasticsearch下载地址
    Spring Data Elasticsearch 下载地址

    term 查询

    • term查询判断某个字段是否包含一个确定的值。一般都是用在keyword、int,long、ip、date等类型上。
    • 避免用在text类型上,在text上应该用match匹配查询。

    注意:term为是否包含的意思!

    1 准备3条测试数据:

    PUT /pigg_test/_doc/1
    { "name": "亚瑟王","age": 30,"sex": "男","tag":["战士", "坦克"] }
    
    PUT /pigg_test/_doc/2
    { "name": "程咬金","age": 40,"sex": "男","tag":["战士", "打野"] }
    
    PUT /pigg_test/_doc/3
    { "name": "安琪拉","age": 15,"sex": "女","tag":["法师"],"date": "2019-01-01","friend": "" }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2 不要text类型上用term查询

    先在name字段上做term查询,发现查询不到文档

    GET pigg_test/_search
    {
      "query": {
        "term": {
          "name": "亚瑟王"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面语句查询不到文档,是因为name默认是text类型,“亚瑟王”被拆成"亚"、“瑟”、“王”这3个汉字索引的,用Term vectors API查询下name字段来验证下。

    GET /pigg_test/_termvectors/1?fields=name
    
    • 1

    返回如下:“亚瑟王”被拆成"亚"、“瑟”、“王”这3个汉字

    "terms" : {
      "亚" : {
        "term_freq" : 1,
        "tokens" : [
          {
            "position" : 0,
            "start_offset" : 0,
            "end_offset" : 1
          }
        ]
      },
      "王" : {
        "term_freq" : 1,
        "tokens" : [
          {
            "position" : 2,
            "start_offset" : 2,
            "end_offset" : 3
          }
        ]
      },
      "瑟" : {
        "term_freq" : 1,
        "tokens" : [
          {
            "position" : 1,
            "start_offset" : 1,
            "end_offset" : 2
          }
        ]
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    keyword类型上进行term查询

    GET pigg_test/_search
    {
      "query": {
        "term": {
          "name.keyword": "亚瑟王"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    long类型上进行term查询

    GET pigg_test/_search
    {
      "query": {
        "term": {
          "age": 30
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    date类型上进行term查询

    GET pigg_test/_search
    {
      "query": {
        "term": {
          "date": "2019-01-01"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3 验证term是包含的意思

    GET pigg_test/_search
    {
      "query": {
        "term": {
          "tag.keyword": "战士"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面查询语句返回了“亚瑟王”和“程咬金”这2个文档,因为他们的tag数组都包含了“战士”。

    terms 查询

    • terms查询和term查询类似,它判断某个字段是否包含某一个或多个确定的值(value)。
    • terms查询的value是一个数组,里面包含多个你想要查询的值,只要有一个值命中就算符合。

    查询tag.keyword包含"战士"或"坦克",返回“亚瑟王”和“程咬金”这2个文档。
    用SQL描述类似 tag in (“战士”, “坦克”)

    GET pigg_test/_search
    {
      "query": {
        "terms": {
          "tag.keyword": ["战士", "坦克"]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    terms_set 查询

    • terms_set查询和terms类似,但它定义了一个最小命中数。比如value数组里有3个值,最小命中数定义为2,说明字段里的值至少命中数组里的2个,才算这个文档符合。

    下面语句设置最小匹配数为2,所以只返回“亚瑟王”这1个文档。

    GET pigg_test/_search
    {
        "query":{
            "terms_set":{
                "tag.keyword":{
                    "terms":["战士","坦克"],
                    "minimum_should_match_script":{
                        "source":"2"
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    行业报告:视频直播美颜sdk对互联网直播产业的影响与前景
    PHP8的类与对象的基本操作之成员变量-PHP8知识详解
    iOS NSKeyedUnarchiver归档和读取
    recycleView自定义ItemDecoration解决列表第一个item和最后一个item的间距难统一问题
    yolov5 focal_loss源码解析
    MongoDB,入门看这一篇足矣!
    使用STM32怎么喂狗 (IWDG)
    Domino蓝色多瑙河版本
    【算法基础】双指针
    laravel的服务容器,服务提供者,门面的理解
  • 原文地址:https://blog.csdn.net/winterking3/article/details/126489980