Elasticsearch学习笔记-Delete By Query API
记录关于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的更多相关文章
- elasticsearch 5.x Delete By Query API(根据条件删除)
之前在 2.X版本里 这个Delete By Query功能被去掉了 因为官方认为会引发一些错误 如需使用 需要自己安装插件. bin/plugin install delete-by-query 需 ...
- elasticsearch 基础 —— Delete By Query API
Delete By Query API _delete_by_query 的简单用法,就是在查询匹配到的每个文档上执行删除.例如: POST twitter/_delete_by_query { &q ...
- ElasticSearch学习笔记(超详细)
文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- Elasticsearch学习笔记一
Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...
- 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 ...
- elasticsearch学习笔记——相关插件和使用场景
logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格 ...
- Elasticsearch学习笔记(十二)filter与query
一.keyword 字段和keyword数据类型 1.测试准备数据 POST /forum/article/_bulk { "index": { "_id" ...
- 【转】Elasticsearch学习笔记
一.常用术语 索引(Index).类型(Type).文档(Document) 索引Index是含有相同属性的文档集合.索引在ES中是通过一个名字来识别的,且必须是英文字母小写,且不含中划线(-):可类 ...
随机推荐
- spring-boot-plus CORS跨域处理
CORS跨域处理 CORS:Cross-Origin Resource Sharing CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domai ...
- hdu 2767 强连通缩点处理加边问题
#include <cstring> #include <cstdlib> #include <cstdio> 缩点的好处就是可以将乱七八糟的有向图 转化为无环的有 ...
- Spring HttpServletRequest对象的获取
1.Controller方法上获取 @RequestMapping(value = "/aliyun/ccc/callComing", method = RequestMethod ...
- 使用.Net Core 2.2创建windows服务
使用.Net Core 2.2创建windows服务 我的环境 win 10 home Visual Studio 2019 v16.1.3 安装有.net core 2.2 创建项目 编辑项目文件 ...
- javaIO——PipedReader & PipedWriter
1. 概述: PipedReader 和 PipedWriter,意为管道读写流.所谓管道,那就是有进有出,所以这也是它们跟其它流对象最显著的区别:PipedReader和PipedWriter必须成 ...
- Linux学习(五)-Linux组管理和权限管理
Linux组基本介绍 在Linux中的每一个用户必须属于一个组,不能独立与组外.在Linux中每个文件有所有者,所在组,其他组的概念 所有者 所在组 其它组 改变用户所在组 1.文件/目录 所有者 文 ...
- Java秒杀实战 (四)JMeter压测
转自:https://blog.csdn.net/qq_41305266/article/details/81071278. 一.JMeter入门 下载链接 http://jmeter.apache. ...
- AJAX—AJAX基础
AJAX简介 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异 ...
- Form组件 cookie和session
django form组件 1.渲染标签 2.校验数据 3.展示信息 第一步需要一个form类 from django import forms class MyForm(forms.Form): n ...
- 02_Hive安装简介
1.下载Hive安装包: 官网下载:http://hive.apache.org/downloads.html 百度云分享:https://pan.baidu.com/s/1M4LmdOXaq6T-P ...