elasticsearch,Performance,elasticsearch" /> elasticsearch,Performance,elasticsearch" />

Performance 通过别名更新Elasticsearch中单个文档的最有效方法

Performance 通过别名更新Elasticsearch中单个文档的最有效方法,performance,elasticsearch,Performance,elasticsearch,我有一个Elasticsearch设置,别名指向许多索引。我需要更新单个文档,但我不知道它位于哪个索引中 在我看来,有两种方法可以实现这一目标: _按查询更新\u: 读取(返回特定索引),然后写入: 哪种方法更有效 首选哪种方法 有比这两种方法更好的方法吗?两种方法的性能相同,但有一点不同,第一种方法只需要发送一个请求,而第二种方法只需要发送两个请求,因此最好使用第一种方法,因为这样可以将API调用减少一半。 在我看来,第一种方法更简洁,更符合Elasticsearch别名的概念,因为您封装了应

我有一个Elasticsearch设置,别名指向许多索引。我需要更新单个文档,但我不知道它位于哪个索引中

在我看来,有两种方法可以实现这一目标:

  • _按查询更新\u:
  • 读取(返回特定索引),然后写入:
  • 哪种方法更有效

    首选哪种方法


    有比这两种方法更好的方法吗?

    两种方法的性能相同,但有一点不同,第一种方法只需要发送一个请求,而第二种方法只需要发送两个请求,因此最好使用第一种方法,因为这样可以将API调用减少一半。 在我看来,第一种方法更简洁,更符合Elasticsearch别名的概念,因为您封装了应用程序中的确切索引名,因为应用程序不需要知道文档所在的确切索引名

    关于在Elasticsearch中更新文档的一个重要注意事项是,Elasticsearch中的文档不会得到更新,这意味着该文档将被标记为已删除,并将创建新文档(这是由于Lucene的实施),然后在Lucene
    段合并过程中,该文档将被实际删除。
    你可以找到一篇关于段合并的好博客文章

    POST my-alias/_update_by_query
    {
      "query": {
        "terms": {
          "_id": ["my-id-to-update"]
        }
      },
      "script": {
        "source": "ctx._source['Field'] = 'new value'"
      }
    }
    
    
    GET my-alias/_search
    {
      "query": {
        "terms": {
          "_id": ["my-id-to-update"]
        }
      }
    }
    
    POST my-index-returned-from-the-get/_update/my-id-to-update
    {
      "doc": {
        "Field": "new value"
      }
    }