【es】Elasticsearch索引数据查询、删除

curl -X GET 'http://xx.xx.xx.xx:9200/test/_search?pretty'
curl -X GET "http://xx.xx.xx.xx:9200/test/_search?size=1&pretty"

{
  "took" : 147,
  "timed_out" : false,
  "_shards" : {
    "total" : 12,
    "successful" : 12,
    "failed" : 0
  },
  "hits" : {
    "total" : 56154711,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "doc",
        "_id" : "5e24002cd08efd7e24854ef1",
        "_score" : 1.0,
        "_source" : {
          "senderName" : "Bogon",
          "filename" : "Wireshark网络分析的艺术.pdf",
          "fileSize" : 178455,
          "sender" : "e7c6d64e-071c-11ea-815f-005056a9ff9e",
          "person" : [
            "e7c6d64e-071c-11ea-815f-005056a9ff9e",
            "0060b6fb-b5e9-4764-a36d-e3be66276586"
          ],
          "groupId" : "e7c6d64e-071c-11ea-815f-005056a9ff9e",
          "id" : "5e24002cd08efd7e24854ef1",
          "fileExt" : "pdf",
          "fileId" : "5e24002c6997ec2479bf5a46",
          "sendTime" : "2020-01-19T15:07:24Z"
        }
      }
    ]
  }
}

curl_es_count.sh

#!/bin/bash

es_url="xx.xx.xx.xx:9200"
index_name="test"
gte_time="2020-01-01T00:00:00Z"
lte_time="2020-01-31T23:59:59Z"

curl -X GET "http://${es_url}/${index_name}/_count?pretty" \
  -H "Content-Type: application/json" \
  -d '{
    "query": {
        "bool": {
            "must": [{
                "range": {
                    "sendTime": {
                        "gte": "'"${gte_time}"'",
                        "lte": "'"${lte_time}"'"
                    }
                }
            }],
            "must_not": [],
            "should": []
        }
    }
}'

curl_es_delete.sh

#!/bin/bash

es_url="xx.xx.xx.xx:9200"
index_name="test"
gte_time="2020-01-01T00:00:00Z"
lte_time="2020-01-31T23:59:59Z"

curl -X POST "http://${es_url}/${index_name}/_delete_by_query?pretty" \
 -H "Content-Type: application/json" \
  -d '{
    "query": {
        "bool": {
            "must": [{
                "range": {
                    "sendTime": {
                        "gte": "'"${gte_time}"'",
                        "lte": "'"${lte_time}"'"
                    }
                }
            }],
            "must_not": [],
            "should": []
        }
    }
}'

通过 这个脚本删除索引中的数据会很慢吗?

删除操作的速度主要取决于以下几个因素:

  1. 数据量大小: 要删除的数据量越大,删除操作就越慢。如果 test 索引中包含大量数据,删除操作可能会比较耗时。

  2. Elasticsearch 集群性能: Elasticsearch 集群的性能也会影响删除操作的速度。如果集群负载高或者硬件配置较低,删除速度可能会变慢。

  3. 查询复杂性: 删除操作的速度还受到查询复杂性的影响。你的脚本中使用了时间范围查询 (range query),这通常比简单的全文档删除操作要慢一些,因为需要匹配和处理更多的文档。

  4. 网络延迟: 脚本中使用的 curl 命令会通过网络与 Elasticsearch 集群通信,网络延迟可能会影响操作速度。

综上所述,虽然可以通过你的脚本来删除数据,但具体速度如何取决于以上因素的综合影响。
如果你的环境中数据量不大、Elasticsearch 集群性能良好,并且网络连接稳定,删除操作可能会比较快速。
如果数据量很大或者集群负载高,删除操作可能会比较耗时,可能需要更长的时间来完成删除操作。

如果才能使得 curl -X POST "http://${es_url}/${index_name}/_delete_by_query?pretty 删除加速?

要加速使用 curl 发起的 _delete_by_query 删除操作,可以考虑以下几点优化:

  1. 减少删除的数据量: 如果可能的话,尽量减少一次删除的文档数量。可以通过更精确的查询条件来限制删除的文档数量,例如更窄的时间范围、更具体的条件等。

  2. 优化查询性能: 确保查询语句的效率尽可能高,避免不必要的复杂性。在你的脚本中,使用了时间范围查询,这通常是比较高效的。确保查询语句没有额外的无用条件或者不必要的逻辑。

  3. 索引优化: 如果索引的映射允许,可以考虑在删除操作之前进行索引优化。例如,确保索引映射的字段类型、分析器设置等能够提高查询性能和删除操作的效率。

  4. 分批处理: 如果数据量非常大,可以考虑分批进行删除操作。例如,按照时间范围分割成多个小的删除请求,每次删除一部分数据。

  5. 增加集群资源: 如果可能的话,增加 Elasticsearch 集群的资源,如节点数、分片数等,以提高删除操作的并发处理能力。

  6. 使用并行删除: 如果允许,可以考虑使用 Elasticsearch 的并行删除功能。在较新的版本中,Elasticsearch 支持在删除操作中使用 slices 参数来并行处理删除请求,可以更快地删除大量数据。

举例来说,如果你希望使用 slices 参数来并行删除,你可以修改你的 curl 请求,添加 slices 参数,例如:

curl -X POST "http://${es_url}/${index_name}/_delete_by_query?pretty&slices=5" \
 -H "Content-Type: application/json" \
 -d '{
    "query": {
        "bool": {
            "must": [{
                "range": {
                    "sendTime": {
                        "gte": "'"${gte_time}"'",
                        "lte": "'"${lte_time}"'"
                    }
                }
            }],
            "must_not": [],
            "should": []
        }
    }
}'

上面的例子中,slices=5 表示请求将被分为 5 个片段并行处理。

总之,通过优化查询、减少单次操作的文档数量、并行处理等方法,可以显著提高 _delete_by_query 删除操作的效率。

在 Elasticsearch 5 版本中,并没有内置支持 slices 参数来实现删除操作的并行处理。
这个功能是在较新的 Elasticsearch 版本中引入的,通常从 Elasticsearch 6.x 版本开始支持。
如果你的环境中使用的是 Elasticsearch 5 版本,那么就无法通过 slices 参数来并行处理 _delete_by_query 操作。

通过这个删除接口es中索引的数据,磁盘空间会立刻释放吗?

  curl -X POST "http://${es_url}/${index_name}/_delete_by_query?pretty"  

使用上述命令通过 Elasticsearch 的 _delete_by_query 接口删除索引数据后,并不会立即释放磁盘空间。
这是因为 Elasticsearch 在执行删除操作后,并不会立即将磁盘上对应的数据物理删除,而是通过后台的过程来标记这些数据为可回收状态。
这种策略是为了避免频繁的物理删除操作影响性能,同时保证系统的稳定性。

实际释放磁盘空间的时间取决于以下几个因素:

  1. Merge 过程:Elasticsearch 会定期进行 segment 的合并(merge),在这个过程中会删除标记为删除的数据,从而释放磁盘空间。

  2. 自动的过期删除:Elasticsearch 会根据其自身的过期策略(例如,过期时间)来自动删除旧数据,从而释放磁盘空间。

  3. 手动触发 Force Merge:如果你希望立即释放空间,可以手动触发 Force Merge 操作,这会强制 Elasticsearch 将标记为删除的数据物理删除并释放磁盘空间。但需要注意,频繁地执行 Force Merge 操作可能会影响性能。

因此,虽然数据被删除后,磁盘空间不会立即被释放,但在正常情况下,Elasticsearch 会在后续的维护过程中自动释放这些空间。

释放磁盘空间的时间取决于多个因素,包括 Elasticsearch 的配置、负载情况以及数据删除的方式。
通常情况下,以下几点可以影响释放磁盘空间的速度:

  1. Merge 过程的频率和策略:Elasticsearch 定期执行 segment 的合并(merge),在合并过程中会删除标记为删除的数据。如果你的索引比较活跃,merge 过程可能会更频繁,从而较快地释放空间。

  2. 自动过期策略:如果你的索引有设置 TTL(Time To Live)或者使用了基于时间的索引策略(例如通过索引别名实现),Elasticsearch 可能会根据这些策略自动删除旧数据,并释放相应的空间。

  3. 手动触发 Force Merge:如果你需要立即释放空间,可以手动触发 Force Merge 操作。这会强制 Elasticsearch 将标记为删除的数据物理删除并释放磁盘空间。但需要注意,频繁地执行 Force Merge 操作可能会影响性能。

  4. 硬盘空间的使用情况:Elasticsearch 也会根据当前硬盘空间的使用情况来调整自动释放空间的速度。当磁盘空间紧张时,可能会优先进行合并操作来释放空间。

总体来说,如果你没有手动触发 Force Merge 操作,通常情况下 Elasticsearch 会在一段时间内(可能是几分钟到几个小时,具体取决于上述因素)自动释放删除的数据所占用的磁盘空间。

如何手动触发 Force Merge,释放磁盘空间?

要手动触发 Force Merge 操作以释放磁盘空间,可以使用 Elasticsearch 的 _forcemerge API。这个操作会强制 Elasticsearch 合并索引中的段(segments),从而物理删除标记为删除的数据并释放磁盘空间。

以下是如何使用 curl 命令进行 Force Merge 操作的示例:

 curl -X POST "http://${es_url}/${index_name}/_forcemerge?max_num_segments=1&pretty"

在这个示例中:

  • ${es_url} 是你的 Elasticsearch 地址,比如 localhost:9200
  • ${index_name} 是你要执行 Force Merge 操作的索引名称。
  • max_num_segments=1 是可选参数,用于指定每个分片最终合并成的最大段数。合并的段数越少,释放空间的效果可能越明显,但同时合并过多段可能会影响性能,因此根据实际情况进行调整。

注意事项:

  • 执行 Force Merge 操作会消耗一定的系统资源和时间,特别是对于大型索引或高负载集群,建议在低负载时执行此操作。
  • 不要频繁地执行 Force Merge,过度使用可能会影响 Elasticsearch 的性能。

执行成功后,Elasticsearch 将尽力合并索引中的段,并且标记为删除的数据将被物理删除,从而释放磁盘空间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354