美文网首页
ElasticSearch | Update By Query

ElasticSearch | Update By Query

作者: 乌鲁木齐001号程序员 | 来源:发表于2020-05-28 19:38 被阅读0次

    重建索引 | 使用场景

    • 索引的 Mapping 发生变更:字段类型更改,分词器及字典更新;
    • 索引的 Settings 发生变更:索引的主分片数发生改变;
    • 集群内或集群间需要做数据迁移

    ElasticSearch | 重建索引的 API

    • Update By Query:在现有索引上重建;
    • Reindex:在其他索引上重建;

    Update By Query | 举几个栗子

    准备数据
    DELETE blogs/
    
    PUT blogs/_doc/1
    {
      "content":"Hadoop is cool",
      "keyword":"hadoop"
    }
    
    GET blogs/_mapping
    
    修改 Mapping | 增加子字段 | 使用英文分词器
    PUT blogs/_mapping
    {
      "properties" : {
        "content" : {
          "type" : "text",
          "fields" : {
            "english" : {
              "type" : "text",
              "analyzer":"english"
            }
          }
        }
      }
    }
    
    写入文档
    PUT blogs/_doc/2
    {
      "content":"Elasticsearch rocks",
        "keyword":"elasticsearch"
    }
    
    查询新写入文档
    • 查询到了,新插入的文档已经应用了修改后的 Mapping;
    POST blogs/_search
    {
      "query": {
        "match": {
          "content.english": "Elasticsearch"
        }
      }
    }
    
    查询修改 Mapping 之前写入的文档
    • 没查询到,这条文档写入的时候,索引的 content 字段还没有子字段 english;
    POST blogs/_search
    {
      "query": {
        "match": {
          "content.english": "Hadoop"
        }
      }
    }
    
    _update_by_query | 更新索引中所有文档
    POST blogs/_update_by_query
    {
    
    }
    
    再次查询修改 Mapping 之前写入的文档
    • 就查到了;
    POST blogs/_search
    {
      "query": {
        "match": {
          "content.english": "Hadoop"
        }
      }
    }
    

    Reindex API | 使用场景

    • 把一个索引中的数据拷贝到另一个索引中;
    • 修改索引的主分片数;
    • 改变字段的 Mapping 中的字段类型;
    • 集群内 / 跨集群数据迁移;

    Reindex API | 注意事项

    • _source 字段必须是 enabled 的;
    • 从一个索引拷贝数据到另一个索引的时候,必须提前创建好目标索引;

    Reindex API | op_type

    • 只有目标索引中没有这个文档,才会把文档写入;否则文档不会写进去,会导致版本冲突;

    Reindex API | 跨集群

    • 需要修改 elasticsearch.yml,并且重启节点;

    Reindex API | 异步操作

    • 在 URL 中指定 POST _reindex?wait_for_completion=false,命令执行以后,会返回 Task Id;
    • 然后可以通过 Task API 查看 Task 执行的具体状况;

    Reindex API | 举个栗子 | 更新已有索引的字段类型

    ElasticSearch 是不允许更新已有索引的字段类型的,如要更新,需新建一个索引,再用 Reindex API 把数据导进去。

    查询已有索引 blogs 的 Mapping
    GET blogs/_mapping
    
    尝试更改已有索引 blogs 字段的类型
    • 更改失败;
    PUT blogs/_mapping
    {
        "properties" : {
        "content" : {
          "type" : "text",
          "fields" : {
            "english" : {
              "type" : "text",
              "analyzer" : "english"
            }
          }
        },
        "keyword" : {
          "type" : "keyword"
        }
      }
    }
    
    创建新的索引 | 设置索引的 Mapping
    DELETE blogs_fix
    
    PUT blogs_fix/
    {
      "mappings": {
          "properties" : {
          "content" : {
            "type" : "text",
            "fields" : {
              "english" : {
                "type" : "text",
                "analyzer" : "english"
              }
            }
          },
          "keyword" : {
            "type" : "keyword"
          }
        }    
      }
    }
    
    Reindex API | 把现有索引的数据写进新的索引中
    POST  _reindex
    {
      "source": {
        "index": "blogs"
      },
      "dest": {
        "index": "blogs_fix"
      }
    }
    
    在新索引中查询文档
    • 查到了;
    GET  blogs_fix/_doc/1
    

    相关文章

      网友评论

          本文标题:ElasticSearch | Update By Query

          本文链接:https://www.haomeiwen.com/subject/moaaahtx.html