如果 ES 存储的数据特别多,在查询时会非常缓慢,还浪费存储。
可以通过 Delete By Query 的方式,删除掉不需要的数据。
基本操作
案例
// 删除 version_value 字段为 64181 的数据
// log_xxx_* 后面的是通配符
POST /log_xxx_*/_delete_by_query
{
"query": {
"bool": {
"must": [
{ "match": { "version_value": 64181 } }
]
}
}
}
POST /log_xxx_2022_10_20/_delete_by_query
{
"query": {
"bool": {
"must": [
{
"exists": {
"field": "version_value"
}
},
{
"range": {
"version_value": {
"gte": 1,
"lte": 87750
}
}
}
]
}
}
}
C# 代码自动操作
根据需要,也可以使用代码,定期执行,删除数据
代码样例,具体写法,参照 NEST 的使用文档。
注意,DateRangeQuery 中的 DateTime,好像不能有毫秒数(需要是 0 )
// DateTime start, DateTime end, int count
var request = new DeleteByQueryRequest<SourceDocument>()
{
Size = count, // 如果一次删除的范围太多,可能会执行失败,执行超时什么的
Query = new BoolQuery()
{
Must = new List<QueryContainer>
{
new DateRangeQuery
{
Field = new Field("date_time"),
GreaterThanOrEqualTo = new DateMathExpression(start),
LessThan = new DateMathExpression(end),
},
new ExistsQuery()
{
Field = new Field("version_value"),
},
new LongRangeQuery()
{
Field = new Field("version_value"),
GreaterThanOrEqualTo = 1,
LessThanOrEqualTo = _maxVersion
}
}
},
};
var response = await _originEsClient.DeleteByQueryAsync(request);
参考资料
ElasticSearch 定时批量删除N天前的数据_geekswg的博客-CSDN博客
使用 Delete By Query API 的方式删除ES索引中的数据 - 腾讯云开发者社区-腾讯云
How to solve version_conflict_engine_exception in Elasticsearch Exception? - Stack Overflow
看完这篇还不会 Elasticsearch 搜索,那我就哭了! - 武培轩 - 博客园
附加
这个仓库,可以根据 js 代码,来生成 ES 查询语句
danpaz/bodybuilder: An elasticsearch query body builder
Bodybuilder | An elasticsearch query body builder