zoukankan      html  css  js  c++  java
  • Elasticsearch-删除数据

    ES-删除数据

    • 删除单个文档或者一组文档。这样做的时候,ES只是将它们标记为删除,所以它们不会再出现于搜索结果中,稍后ES通过异步的方式将它们彻底的从索引中移出。
    • 删除整个索引。这是删除多组文档的特例。但是不同点在于这样做的性能更好。主要的工作就是移除和那个索引相关的所有文件,几乎是瞬间就能完成。
    • 关闭索引。关闭的索引不允许读取或写入操作,数据也不会加载到内存。这和删除ES数据类似,但是索引还是保留在磁盘上。它也很容易恢复,主要再次打开关闭的索引。

    删除文档

    (1).通过ID删除单个文档。如果只有一篇文档要删除,而且知道要删除的ID,这样做非常nice。
    (2).在单个请求中删除多篇文档。如果有多篇文档需要删除,可以在一个批量请求中一次性删除它们,这样比每次只删除一篇文档更快。
    (3).删除映射类型,包括其中的文档。这样的操作会高效地搜索并删除该类型中所索引的全部文档,也包括映射本身。
    (4).删除匹配某个查询的所有文档。这和删除映射类型相似,内部运行一个查询,并识别需要删除的文档。只有在这里可以指定任何想要的查询,然后删除匹配的文档。

    1删除单个文档

    为了删除单一的文档,需要向其URL发送HTTP DELETE请求
    curl -XDELETE 'localhost:9200/online-shop/shirts/1'
    也可以使用版本来管理删除操作的并发,就像索引和更新的并发控制一样。如:假设某款衬衫销售一空,想移除这篇文档,这样就不会出现在搜索结果中。但是当时可能并不知道新的采购到货了,而且库存数据也已经被更新了。为了避免这种情况,可以再DELETE请求中加入版本参数,就像索引和更新的操作那样
    curl -XDELETE 'localhost:9200/online-shop/shirts/1?version=4'
    尽管如此,删除的版本控制还是有个特殊情况。一旦删除了文档,它就不复存在了,于是一个更新操作很容易重新创建该文档,尽管这是不应该发生的(因为更新的版本比删除的版本更低)。由于外部版本可以用于不存在的文档上,使用外部版本时这个问题尤为突出。
    为了防止这样的问题发生,ES将在一段时间内保留这篇文档的版本,如此它就能拒绝版本比删除操作更低的更新操作了。默认情况下这个时间段是60秒,对于多数情况而言应该足以了,可以通过设置elasticsearch.yml文件中或者是每个索引配置中的index.gc_deletes来修改它。

    2删除映射类型和删除查询匹配的文档

    删除整个映射类型,包括映射本身和其中索引的全部文档。
    curl -XDELETE 'localhost:9200/online-shop/shirts'
    删除类型时需要注意的是,类型名称只是文档中的另一个字段。索引中的所有文档,无论它们属于哪个映射类型,都存放在同一个分片中。当发送前面的命令时,ES只能查询属于那个类型的文档,然后删除它们。删除类型通常要耗费更长的时间和更多的资源。
    可以查询某个类型中所有的文档并删除它们,ES允许通过称为通过查询删除(delete by query)的API来指定自己的查询,查找想要删除的文档。使用这个API和运行查询类似,除了HTTP请求变温DELETE,而且_search变为了_query。
    从音乐索引music中移除所有匹配”jay”的文档:
    curl -XDELETE 'localhost:9200/music/_query?q=jay'

    删除索引

    为了删除一个索引,需要发送一个DELETE请求到该索引的URL:
    curl -XDELETE 'localhost:9200/music/'
    通过提供以逗号分隔的列表,还可以删除多个索引。如果将索引名称改为_all,甚至可以删除全部的索引。
    提示:使用curl -XDELETE 'localhost:9200/_all'会删除所有的文档,为了预防这种情况的发生,可以设置elasticsearch.yml中的action.destructive_requires_name:true。这会使得ES在删除的时候拒绝_all参数,以及索引名称中的通配符。
    删除索引是很快的,因为他基本上就是移除了和索引分片相关的文件。和删除单独的文档相比,删除文件系统中的文件更快。这样操作的时候,文件只是被标记为已删除。在分段进行合并时,他们才会被移除。这里的合并是指将多个Lucene小分段组合为一个更大分段的过程。

    分段与合并

    一个分段是建立索引的时候所创建的一块Lucene索引(ES的分片)。当索引新的文档时,其内容不会添加到分段的尾部,而只会创建新的分段。由于删除操作只是将文档标记为待删除,所以分段中的数据也从来不会被移除。最终,更新文档意味着重新索引,数据就永远不会被修改。
    当ES在分片上进行查询的时候,Lucene需要查询它所有的分段,合并结果,然后将其返回--就像查询同一索引中多个分片的过程。就像分片那样,分段越多,搜索请求越慢。
    日常的索引操作会产生很多这样的小片段。为了避免一个索引中存在过多的分段,Lucene定期将分段进行合并。
    合并文档意味着读取它们的内容(除了被删除的文档),然后利用组合的内容创建信息、更大的分段。这个过程需要资源,尤其是CPU和磁盘的IO。合并操作是异步运行的,ES也允许配置相关的若干选项。

    关闭索引

    除了删除索引,还可以关闭它们。如果关闭了一个索引,就无法通过ES来读取和写入其中的数据,知道再次打开它。当使用应用日志这样的流式数据时,此操作非常有用。
    当想永久的保存应用日志,以防要查看很久之前的信息。另一方面,在ES中存放大量数据需要增加资源。对于这种使用案例,关闭旧的索引非常有意义。可能并不需要那些数据,但是也不想删除它们。
    关闭索引:
    curl -XPOST 'localhost:9200/online-shop/_close'
    为了再次打开
    curl -XPOST 'localhost:9200/online-shop/_open'
    一旦索引被关闭,它在ES内存中唯一的痕迹是其元数据,如名字以及分片的位置。如果有足够的磁盘空间,而且也不确定是否需要在那个数据中再次搜索,关闭索引要比删除索引更好。永远可以重新打开被关闭的索引,然后在其中再次搜索。

  • 相关阅读:
    Java多线程之等待唤醒机制
    Java多线程之线程间的通信
    Java多线程之八锁问题
    Java多线程之基础
    el-table的动态合并行和列
    服务器、IP地址和域名之间有什么关系?
    node学习ing
    swipper的轮播图
    swipper内的部分区域的滚动(overflow: auto)与整个屏幕滚动冲突
    vue项目中引入 html2canvas ,控制台报错 Cannot assign to read only property 'className' of object '#< SVGSVGElement >'
  • 原文地址:https://www.cnblogs.com/EnzoDin/p/11186210.html
Copyright © 2011-2022 走看看