• ES mapping之keyword;term查询添加keyword查询;更改mapping keyword类型


    参考:https://blog.csdn.net/winterking3/article/details/108254346
    https://www.cnblogs.com/shoufeng/p/11103913.html
    https://blog.csdn.net/tclzsn7456/article/details/79956625

    1、ES mapping之keyword

    默认mapping结构一般是:
    如果不设置mapping,ES默认把字符串设为text类型,并包含一个keyword子类型。
    在这里插入图片描述
    ***这种结构保存字段会存两份索引(个人理解),首先第一个type text这个会进行分词建索引保存,再后面fields keyword会进行保存完整字符串附加

    所以一个articleID过来的时候,会建立两次索引。一次是自己本身(articleID),是要分词的,分词后放入倒排索引;另一次是基于articleID.keyword,不分词,最多保留256字符,直接一个完整的字符串放入倒排索引中

    term查询

    1)直接term
    (结构查不到,这是因为不加任何默认是text类型,这个字段保存是有分词,比如电影分成了电和影两个字保存)

    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "channel": "电影"
              }
            }
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    索引这里改成单字查询可以查询到

    
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "channel": "电"
              }
            }
          ]
        }
      }
    }
    ##或
    
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "channel": "影"
              }
            }
          ]
        }
      }
    }
    
    
    • 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

    或者用match查询,这会进行分词后再查询

    
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "channel": "电影"
              }
            }
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2)具体全匹配查询term+keywod
    这种查询会依据mapping里子类型keyword字段匹配,必须包含查询字符串不分词,相当于是查询的不分词前的原来字符串

    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "channel.keyword": "电影"
              }
            }
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3、更改mapping keyword类型

    直接去掉text那一级,吧text直接改成keyword,这种皆可以直接进行term查询进行不分词全匹配了,不用再加keyword

    #设置channel为keyword
    PUT pigg_user
    {
      "mappings": {
        "properties": {
          "channel": {
            "type":  "keyword"
          },
          "age": {
            "type": "short"
          }
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    Js与Jq实战:第三讲:JavaScript对象编程
    【Linux】线程控制
    在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)
    【能效管理】安科瑞远程预付费系统在江西某沃尔玛收费管理的应用
    springboot实现主从数据库动态切换(注解式)
    springboot-dubbo and Thymeleaf使用
    CPU架构 -- ARMv7与ARMv8协处理器比较
    Maven间接依赖
    通过随机平滑验证对抗鲁棒性
    CVE-2021-35042
  • 原文地址:https://blog.csdn.net/weixin_42357472/article/details/125439925