ES. _update_by_query

场景: 给es里某个字段增加一个子类型,要求之前的数据也能被查询到

  • 如上场景,我们可以使用es里的_update_by_query
  • 例如
    POST class/_update_by_query

    直接对加完类型的索引使用即可。

  • 下面是一个例子

    PUT class
    {
      "mappings" : {
          "properties" : {
            "student" : {
              "type" : "nested",
              "properties" : {
                "name" : {
                  "type" : "keyword",
                  "fields" : {
                    "ik" : {
                      "type" : "text",
                      "analyzer" : "ik_max_word"
                    }
                  }
                }
              }
            }
          }
        }
    }

    创建一个索引,设置mapping

    {
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "index" : "class"
    }
    

    索引创建完毕,开始写入数据

    PUT class/_doc/1
    {
      "student" : [
                {
                  "name" : "GO"
                }
              ]
    }

    写入一条数据,然后修改mapping,增加一个子字段

    PUT class/_mapping
    {
     "properties" : {
            "student" : {
              "type" : "nested",
              "properties" : {
                "name" : {
                  "type" : "keyword",
                  "fields" : {
                    "ik" : {
                      "type" : "text",
                      "analyzer" : "ik_max_word"
                    },
                    "ik_smart" : {
                      "type" : "text",
                      "analyzer" : "ik_smart"
                    }
                  }
                }
              }
            }
          }
    }

    加号字段后我们再插入一条数据

    PUT class/_doc/2
    {
      "student" : [
                {
                  "name" : "GO"
                }
              ]
    }

    然后我们分别使用最大颗粒度查询这两个name

    GET class/_search
    {
      "query": {
        "nested": {
          "path": "student",
          "query": {
            "bool": {
              "filter": {
               "term": {
                 "student.name.ik_smart": "go"
               }
              }
            }
          }
        }
      }
    }
    
    
    GET class/_search
    {
      "query": {
        "nested": {
          "path": "student",
          "query": {
            "bool": {
              "filter": {
               "term": {
                 "student.name.ik_smart": "php"
               }
              }
            }
          }
        }
      }
    }
    
    
    

    结果go查不到,而php能查到,因php是在更改mapping后插入的,新增加的子字段在php上生效,所以可以查询到,而go是在修改mapping之前插入的,新字段没有生效,所以查询不到,如果我们要让旧数据也生效,该怎么做呢

    POST class/_update_by_query

    我们可以直接对索引适用update_by_query,这样旧的数据也会增加子字段,再次查询的时候我们就会发现,go也能搜索到了

你可能感兴趣的:(elasticsearch)