记录关于Elasticsearch的文档删除API的学习

首先官网上Document APIs介绍了 Delete API 和Delete By Query API。

Delete API
可以通过指定索引–>类型–>id的方式对文档进行删除

DELETE /index/type/1
1
响应body

{
    "_shards" : {
        "total" : 2,
        "failed" : 0,
        "successful" : 2
    },
    "found" : true,
    "_index" : "index",
    "_type" : "type",
    "_id" : "1",
    "_version" : 2,
    "result": "deleted"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
Versioning
每个文档都会对应一个版本,当我们执行删除操作时,版本号也要指定。来确保执行删除时,没有同时执行写入操作。不论是写入操作还是删除操作,都会对文档的版本进行更改。所以当我们使用这个Delete API删除文档时,并不是真正意义上的删除,只是版本变化并且对文档增加了删除标记。当我们再次搜索的时候,会搜索全部然后过滤掉有删除标记的文档。如果数据量大的话,对搜索的性能有一定的影响。必须对它进行物理删除。

物理删除方法:
谈到物理删除,就是把删除的文档信息从磁盘空间中去掉。还需要了解Elasticsearch官方文档的Indices APIs的Indices Segments。

Indeices Segments(段)
它是用于构建Lucene索引(碎片级)的低级段信息,提供关于碎片和索引状态的更多信息,可能是优化信息、删除时“浪费”的数据等等。

Segments有一个关于删除文档的重要属性就是,被标记删除的文档存储在Segment中。如果这个数量大于0是完全可以的,那么在合并这个segment 时将回收空间。

因此如果我们想进行物理删除,必须进行段合并。理论上是Elasticsearch会自己进行段合并,但是合并的数量随机,很难保证将标记删除的文档的段进行合并。因此需要进行配置。

Delete By Query API
除了指定删除之外,官网还提供了根据查询条件进行文档删除。

POST twitter/_delete_by_query
{
  "query": {
    "match": {
      "message": "some message"
    }
  }
}
1
2
3
4
5
6
7
8
请求体跟Search API是一样的

响应Body

{
  "took" : 147,
  "timed_out": false,
  "deleted": 119,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1.0,
  "throttled_until_millis": 0,
  "total": 119,
  "failures" : [ ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
应用实例:
学习过删除文档操作之后,就要进行应用啦。由于项目是使用java,对Elasticsearch文档进行操作的。因此要对Elasticsearch Client进行选型。TransportClient迟早要gg,因此果断选择java REST Client(优点:1.可以使用TransportClient功能 2.可以向前兼容Elasticsearch版本集群)。但是在REST Client 6.5之前,官网是没有对Delete By Query API进行介绍的,也就是说想使用按照搜索方式删除文档,需要借助TransportClient。这里我们可以直接使用REST Client 6.5

REST Client ----Delete By Query API
代码:

//创建客户端
RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("192.168.XXX.XX", 9200, "http"))
                .setMaxRetryTimeoutMillis(X * 60 * 1000) //超时时间设为X分钟
                );
//查询要删除的文档
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest("_all");
deleteByQueryRequest.setConflicts("proceed");        
request.setQuery(new TermQueryBuilder("user", "kimchy"));
deleteByQueryRequest.setSize(size);
BulkByScrollResponse bulkResponse = client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
//合并段,进行物理删除
ForceMergeRequest requestAll = new ForceMergeRequest();
requestAll.maxNumSegments(1);
requestAll.onlyExpungeDeletes(true);
ForceMergeResponse forceMergeResponse = client.indices().forcemerge(requestAll, RequestOptions.DEFAULT);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
参考:

[1] https://www.elastic.co/guide/en/elasticsearch/reference/5.6/docs-delete.html elasticsearch5.6官网
[2] https://www.elastic.co/guide/en/elasticsearch/reference/5.6/indices-forcemerge.html elasticsearch5.6官网
[3] https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-delete-by-query.html REST Client 6.5 delete by query

[4] https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-force-merge.html
REST Client 6.5 段合并

Elasticsearch学习笔记-Delete By Query API的更多相关文章

  1. elasticsearch 5.x Delete By Query API(根据条件删除)

    之前在 2.X版本里 这个Delete By Query功能被去掉了 因为官方认为会引发一些错误 如需使用 需要自己安装插件. bin/plugin install delete-by-query 需 ...

  2. elasticsearch 基础 —— Delete By Query API

    Delete By Query API _delete_by_query 的简单用法,就是在查询匹配到的每个文档上执行删除.例如: POST twitter/_delete_by_query { &q ...

  3. ElasticSearch学习笔记(超详细)

    文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...

  4. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  5. Elasticsearch学习笔记一

    Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...

  6. elasticsearch6.7 05. Document APIs(5)Delete By Query API

    4.Delete By Query API _delete_by_query API可以删除某个匹配条件的文档: POST twitter/_delete_by_query { "query ...

  7. elasticsearch学习笔记——相关插件和使用场景

    logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格 ...

  8. Elasticsearch学习笔记(十二)filter与query

    一.keyword 字段和keyword数据类型    1.测试准备数据 POST /forum/article/_bulk { "index": { "_id" ...

  9. 【转】Elasticsearch学习笔记

    一.常用术语 索引(Index).类型(Type).文档(Document) 索引Index是含有相同属性的文档集合.索引在ES中是通过一个名字来识别的,且必须是英文字母小写,且不含中划线(-):可类 ...

随机推荐

  1. 红外 NEC编码

    它是一种电磁波,可以实现数据的无线传输 它的波长范围为760nm ~ 1mm,不为人眼所见 紫外光波长为10-400nm 红外与蓝牙 红外:对准.直接.0-10米,单对单 蓝牙:10米左右,加强信号后 ...

  2. php连接oracle oracle开启扩展

    <?php /** * 由于公司的需要,使用php+oracle开发项目,oracle因为有专门人员开发设计,我们只需远程调用 *于是乎遇到了蛋疼的问题就是开启oracle扩展的问题,虽然你在p ...

  3. Hadoop_28_MapReduce_自定义 inputFormat

    1. 自定义inputFormat 1.1.需求: 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件,此时就需要有相应解决方案; 1.2.分析: 小文件的优化 ...

  4. Django_01_创建图书管理项目

    在django中,项目的组织结构为一个项目包含多个应用,一个应用对应一个业务模块 示例:创建项目的名称为test1,完成“图书-英雄”信息的维护,创建应用名称为booktest 创建项目:首先进入到虚 ...

  5. Maven 安装依赖包

    Guide to installing 3rd party JARs Although rarely, but sometimes you will have 3rd party JARs that ...

  6. java——double数据精度问题

    代码:使用BigDecimal来代替double public class BigDecimalUtil { public static BigDecimal add(double v1,double ...

  7. Python3+Appium学习笔记04-自动下载apk

    在项目中,app更新后,都会发布新的apk版本,然后去蒲公英对应的网站上扫码下载对应的apk进行测试.所以就在想,通过app参数进行安装时,是否可以先通过代码去拉取一遍最新的apk安装包. ​ 因为学 ...

  8. CVE-2018-10933 LibSSH auth bypass

    漏洞原理 认证实现错误, 认证分为多个步骤,可以直接跳到成功的步骤       A vulnerability was found in libssh's server-side state mach ...

  9. asyncio模块实现线程的嵌套和穿插

    import asyncio import time now = lambda :time.time() async def cpc_1(x): print('正在烙比萨饼,预计{}分钟'.forma ...

  10. flutter 跳转至根路由

    上代码 //flutter 登录后跳转到根路由 Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (co ...