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中是通过一个名字来识别的,且必须是英文字母小写,且不含中划线(-):可类 ...
随机推荐
- select into from与insert into select区别
创建一个table2 向table2中插入 table1中name为11的所有行(前提table2不存在) select * into table2 from table1 where name=‘ ...
- TCP协议探究(四):定时器
1 概述 重传定时器:使用于当希望收到另一端的确认. 坚持(persist)定时器:使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口 保活(keepalive)定时器:用于检测一个空闲连接的另一 ...
- python 画3D的高斯曲线
用python画3D的高斯曲线,我想如果有多个峰怎么画? import numpy as npimport matplotlib.pyplot as pltimport mathimport mpl_ ...
- C++性能榨汁机之虚函数的开销
C++性能榨汁机之虚函数的开销 来源 http://irootlee.com/juicer_vtable/ 虚函数的实现 虽然C++标准并没有规定编译器实现虚函数的方式,但是大部分编译器均是采用了虚 ...
- sipp如何避免dead call
uac 和 uas 都加上 -deadcall_wait 0
- ASP.NET---如何使用web api创建web服务
1 首先创建asp.net web空项目,并且创建模拟数据,我在工程下面创建了一个Models文件夹,在文件夹Nodels下面创建类Product和Repository 具体如下: [Serializ ...
- 使用SSH命令行远程登录运行在CloudFoundry上的应用
当我试图用如下命令行采用SSH远程登录到运行在CloudFoundry环境下的应用时, cf ssh -N -T -L 9229:127.0.0.1:9229 jerry-demo-server 遇到 ...
- pycharm中代码窗口如何分成左右或者上下双栏
操作步骤如下: 其中window->edit_tabs->Split Vertically 是分成左右双栏:选择Split Horizontally 是分成上下双栏
- 智能指针原理及实现(2)unique_ptr
只允许基础指针的一个所有者. 可以移到新所有者(具有移动语义),但不会复制或共享(即我们无法得到指向同一个对象的两个unique_ptr). 替换已弃用的 auto_ptr. 相较于 boost::s ...
- openresty 阶段说明
开发中常用的7阶段 set_by_lua*: 流程分支处理判断变量初始化 rewrite_by_lua*: 转发.重定向.缓存等功能(例如特定请求代理到外网) access_by_lua*: IP 准 ...