Elasticsearch使用篇 - 更新文档

这篇具有很好参考价值的文章主要介绍了Elasticsearch使用篇 - 更新文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

更新的内部机制

elasticsearch 更新文档,Elasticsearch,elasticsearch,大数据

注意:实际使用 murmurhash 算法

elasticsearch 更新文档,Elasticsearch,elasticsearch,大数据

注意:更新任何一个字段都是全部删除。并发更新操作之间无事务隔离保证,会产生数据错位问题。

更新操作

1、单条覆盖更新

1、覆盖式更新,由客户端完成所有数据的组装,服务端认可数据的完整性,执行覆盖。

2、数据更新一次,内部会先删除,再插入。

3、数据总条数增加,直到下一次物理文件合并才会恢复正常统计。

PUT demo-000001
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "refresh_interval": "30s"
  }
}

number_of_shards:指定索引对应的主分片的个数。默认 1。该参数只能在创建索引时指定。每个索引最多有 1024 个分片。可以通过指定 export ES_JAVA_OPTS="-Des.index.max_number_of_shards=128" 系统变量来修改该限制。

number_of_replicas:指定每个主分片对应的副本分片的个数。默认 1。

refresh_interval:控制刷新的时间间隔。刷新可以使索引的最近变化对于搜索可见,默认 1s。可以设置为 -1,表示禁止刷新。

更多索引参数可以参考 Elasticsearch官方的索引参数介绍


插入 id 为 1 的文档

PUT demo-000001/_doc/1
{
 "name": "tom"
}

紧接着在 30 秒之内进行搜索,却发现没有搜索结果

GET demo-000001/_search

然后执行刷新操作

POST demo-000001/_refresh

接着进行搜索,却发现有了搜索结果

GET demo-000001/_search

接着插入 id 为 1 的文档,但是文档内容不同。

PUT demo-000001/_doc/1
{
  "content": "hello world"
}

接着进行搜索,却发现原来 id 为 1 的文档的内容被覆盖了。

2、单条局部更新

1、局部更新本质也是覆盖式更新,只是由服务端完成数据的合并。

2、支持 upsert 与 script 更新。

3、一定要使用 POST,而不能使用 PUT。

接着对 id 为 1 的文档执行局部更新操作,增加一个 “title” 字段。

POST demo-000001/_update/1
{
  "doc": {
    "title": "how to do it"
  }
}

接着进行搜索,发现文档原来的 “content” 字段保留了下来,此时文档中有 “title”、“content” 两个字段。

GET demo-000001/_search

测试一下,如果先删除 id 为 1 的文档,再执行局部更新操作。

DELETE demo-000001/_doc/1

同样地,执行局部更新操作,却出现 “document_missing_exception” 异常

POST demo-000001/_update/1
{
  "doc": {
    "title": "how to do it"
  }
}

对此需要加 doc_as_upsert,如果指定文档不存在就进行插入。

POST demo-000001/_update/1
{
  "doc": {
    "title": "how to do it"
  },
  "doc_as_upsert": true
}

再来试一下脚本方式的局部更新。

首先插入一条 id 为 2 的文档。

PUT demo-000001/_doc/2
{
  "content": "hi world",
  "income": 100
}

接着对这条 id 为 2 的文档执行脚本局部更新。

POST demo-000001/_update/2
{
  "script": {
    "source": """
      ctx._source.income += 200
    """
  }
}

搜索发现,id 为 2 的文档的 income 的值变为了 300,并且 content 字段也保留了下来。

GET demo-000001/_search

再试一下使用脚本删除字段。

POST demo-000001/_update/2
{
  "script": {
    "source": """
      if (ctx._source.containsKey('content')) {
        ctx._source.remove('content')
      }
    """
  }
}

如果使用脚本方式进行更新,但是指定 id 的文档事先不存在,就需要使用 upsert、scripted_upsert 参数分别指定指定参数的默认值、如果脚本方式操作的文档不存在时是否进行插入。

POST demo-000001/_update/3
{
  "script": {
    "source": """
      ctx._source.income += params.p1
    """,
    "params": {
      "p1":  100
    }
  },
  "upsert": {
    "income": 100
  },
  "scripted_upsert": true
}

3、批量更新

1、海量数据更新优先选择 bulk。

2、支持插入式更新。

3、单条更新实际内部也是 bulk 执行。

4、实际是局部更新。

POST _bulk
{"update":{"_id":"1","_index":"book"}}
{"doc":{"content":"hello world","title":"this is title"},"doc_as_upsert":true}
{"update":{"_id":"1","_index":"book"}}
{"doc":{"content":"hi world"}}

4、条件更新

1、内部实现基于快照查询机制。

2、内部异步完成。

首先创建 kibana_sample_data_logs_update 索引

POST _reindex
{
  "source": {
    "index": "kibana_sample_data_logs"
  },
  "dest": {
    "index": "kibana_sample_data_logs_update"
  }
}

接着执行条件更新

POST kibana_sample_data_logs_update/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": """
    ctx._source.host = 'www.baidu.com'
  """
}

并发冲突

因为 Elasticsearch 不支持严格的 ACID 事务特性,并且更新过程包括:"查询-标记删除-插入"三个操作。

查询时添加 version 请求参数,并且设置为 true,可以在响应体中返回 version 版本号。

GET demo-000001/_search?version=true

更新文档时,可以使用 version_type 请求参数指定一个外部版本号。

PUT demo-000001/_doc/4?version=11&version_type=external
{
  "title": "this is forth document"
}

如果 version_type 请求参数为 external,则下一次更新时就需要指定大于文档当前的版本号才会成功执行。

PUT demo-000001/_doc/4?version=20&version_type=external
{
  "title": "this is forth document"
}

如果 version_type 请求参数为 external_gte,则下一次更新时就需要指定大于等于文档当前的版本号才会成功执行。文章来源地址https://www.toymoban.com/news/detail-774723.html

PUT demo-000001/_doc/4?version=20&version_type=external_gte
{
  "title": "this is my forth document"
}

到了这里,关于Elasticsearch使用篇 - 更新文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch:是时候离开了! - 在 Elasticsearch 文档上使用 TTL

    作者:来自 Elastic David Pilato 想象一下,圣诞老人必须向世界上所有的孩子们分发礼物。 他有很多工作要做,他需要保持高效。 他有一份所有孩子的名单,并且知道他们住在哪里。 他很可能会将礼物按区域分组,然后再交付。 但他不会在同一个地方停留太久。 他会丢下礼物

    2024年01月21日
    浏览(60)
  • Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去

    当应用程序需要向 Elasticsearch 添加文档时,它们首先要知道目标索引是什么。在很多的应用案例中,特别是针对时序数据,我们想把每个月的数据写入到一个特定的索引中。一方面便于管理索引,另外一方面在将来搜索的时候可以按照每个月的索引来进行搜索,这样速度更快

    2023年04月09日
    浏览(53)
  • Elasticsearch 根据条件批量更新数据

    2024年02月12日
    浏览(44)
  • 【ElasticSearch】ElasticSearch Java API的使用——常用索引、文档、查询操作(二)

    Elaticsearch ,简称为es,es是一个开源的 高扩展 的 分布式全文检索引擎 ,它可以近乎 实时的存储 、 检索数据; 本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的 目的

    2024年01月16日
    浏览(82)
  • 第16篇:Elasticsearch文档元数据信息

    背景:目前国内有大量的公司都在使用 Elasticsearch,包括阿里、京东、滴滴、今日头条、小米、vivo等诸多知名公司。除了搜索功能之外,Elasticsearch还结合Kibana、Logstash、Elastic Stack还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控等多个领域。  本节内容:El

    2024年01月25日
    浏览(26)
  • (五) ElasticSearch 数据类型和文档CRUD操作

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#_complex_datatypes 核心数据类型是 Elasticsearch 最基本和常用的数据类型,用于存储大部分数据。这些核心数据类型包括: Text(文本):用于存储长文本数据,进行全文搜索和分析。 Keyword():

    2024年02月11日
    浏览(37)
  • Elasticsearch 详细使用文档及java案例

    Elasticsearch 是一个开源的分布式搜索引擎,它可以快速地存储、搜索和分析大量数据。它使用 Lucene 作为底层搜索引擎,提供了 RESTful API 接口,支持多种数据格式和查询语言。 本文档将介绍 Elasticsearch 的基本概念、安装和配置、数据索引和查询、集群管理等方面的内容。 索引

    2024年02月10日
    浏览(37)
  • elasticsearch 父子文档使用must not 正确姿势

    1、基于elasticsearch 父子文档进行子条件查询父文档 2、需要查询出子文档不存在的父文档 1、父文档clue_list 关联很多的子文档,我们用roam子文档做测试! 2、roam子文档的结构 需求是查询出roam子文档不存在的数据,由于我们es的所有数据companyId == 1 我们可以用must not来排除 co

    2024年02月05日
    浏览(43)
  • Elasticsearch:使用不同的 CA 更新安全证书 (二)

    在之前的文章 “Elasticsearch:使用不同的 CA 更新安全证书 (一)” 中,我详细地描述了如何更新 transport 层的证书。transport 层的证书复制集群中各个节点之前的连接,甚至关乎集群之前的连接。在这边文章中,我将继续之前的内容来详述如何替换 HTTP 层的证书。 HTTP:用于

    2023年04月08日
    浏览(32)
  • Elasticsearch:使用 count API 来获得所有文档的个数

    在我开始使用 Elasticsearch 的时候,我希望获得给定查询的文档总数。比如我们想对数据进行分页显示。从 Elasticsearch 7.0之后,为了提高搜索的性能,在 hits 字段中返回的文档数有时不是最精确的数值。Elasticsearch 限制了最多的数值为10000。我们知道 Search API 提供的计数不准确

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包