让 Elasticsearch Delete By Query 请求立即生效

让 Elasticsearch Delete By Query 请求立即生效

在 Elasticsearch 中,Delete By Query 操作默认是近实时的(near real-time),这意味着删除操作可能不会立即对搜索可见。要让删除操作立即生效,你可以使用以下几种方法:

1. 使用 refresh 参数

在请求中设置 refresh 参数为 truewait_for

go 复制代码
req := esapi.DeleteByQueryRequest{
    Index:      []string{doc.IndexName()},
    Body:       strings.NewReader(string(body)),
    Refresh:    esapi.BoolPtr(true), // 立即刷新
    // 或者使用 wait_for 让操作在刷新后返回
    // Refresh:    esapi.StringPtr("wait_for"),
}

2. 手动刷新索引

执行删除操作后,立即刷新相关索引:

go 复制代码
// 执行删除操作
res, err := req.Do(context.Background(), client)
if err != nil {
    // 处理错误
}
defer res.Body.Close()

// 手动刷新索引
refreshReq := esapi.IndicesRefreshRequest{
    Index: []string{doc.IndexName()},
}
refreshRes, err := refreshReq.Do(context.Background(), client)
if err != nil {
    // 处理错误
}
defer refreshRes.Body.Close()

3. 配置索引的刷新间隔

如果你经常需要实时操作,可以考虑将索引的刷新间隔设置为1秒(默认值):

json 复制代码
PUT /your_index/_settings
{
  "index.refresh_interval": "1s"
}

或者完全禁用自动刷新,改为手动控制:

json 复制代码
PUT /your_index/_settings
{
  "index.refresh_interval": "-1"
}

4. 使用 ?refresh URL 参数

如果你使用的是 REST API 而不是 Go 客户端,可以在 URL 中添加 ?refresh 参数:

复制代码
POST /your_index/_delete_by_query?refresh
{
  "query": { ... }
}

最佳实践建议

  1. 对于生产环境,频繁的刷新操作会影响性能,建议:

    • 批量操作时使用 refresh=wait_for
    • 对实时性要求高的单次操作使用 refresh=true
    • 大多数情况下依赖默认的刷新机制
  2. 如果你正在执行大量删除操作,考虑在操作完成后执行一次手动刷新,而不是每次删除都刷新。

  3. 注意 refresh=true 会立即创建新的段文件,可能导致更多的段合并操作,从而影响集群性能。

相关推荐
小羊没烦恼!19 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
一隅论数智19 小时前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
尧炎科技20 小时前
防潮抗变形,就选纯品梅花全桉多层板
大数据
程序员大阳21 小时前
副队长大数据教程(5)--集群情况下虚拟机网络配置
大数据·集群·nat·网路
自由能燃气设备21 小时前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远21 小时前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
嘉立创FPC苗工21 小时前
FPC与机器人的双向赋能,解锁智能装备进化新势能
大数据·人工智能·制造·fpc·电路板
AI职业加油站21 小时前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
龙亘川21 小时前
一网统管AI平台民生业务实践:基于城市数字底座赋能公积金业务服务升级
大数据·安全·智慧城市·开源软件·数据可视化·政务
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构