<del id="cqywy"></del>
  • <ul id="cqywy"></ul>
  • <ul id="cqywy"></ul>
  • <del id="cqywy"></del>
  • <strike id="cqywy"><rt id="cqywy"></rt></strike>
    <ul id="cqywy"></ul><cite id="cqywy"><input id="cqywy"></input></cite>
    <tfoot id="cqywy"></tfoot>
    <ul id="cqywy"></ul>
    • <ul id="cqywy"></ul>
    • 久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
      分享

      Elasticsearch 索引字段刪除,除了 Reindex 重建索引還有沒有別的解決方案?

       銘毅天下 2025-08-28 發(fā)布于廣東

      unsetunset1、問題來源unsetunset

      在生產(chǎn)環(huán)境維護(hù) Elasticsearch 集群的過程中,經(jīng)常會遇到這樣的場景:

      業(yè)務(wù)需求變更導(dǎo)致某些字段不再使用,或者早期設(shè)計時添加了一些冗余字段,現(xiàn)在需要清理掉。

      最近球友在公司的一個項目中就遇到了這個問題,用戶行為分析索引中存在十幾個歷史遺留的字段,這些字段不僅占用存儲空間,還影響查詢性能。

      傳統(tǒng)的解決方案是通過重建索引(reindex)來實現(xiàn)字段刪除,但對于有幾十個索引、單個索引數(shù)據(jù)量達(dá)到百萬級別的生產(chǎn)環(huán)境來說,重建索引的成本相當(dāng)高昂。

      數(shù)據(jù)遷移過程中不僅要考慮服務(wù)可用性,還要處理增量數(shù)據(jù)同步問題,整個過程可能需要數(shù)小時甚至更長時間。

      在尋找更優(yōu)雅解決方案的過程中,Elasticsearch 的設(shè)計哲學(xué)決定了 mapping 一旦創(chuàng)建就不能直接刪除字段,這個限制讓很多開發(fā)者感到困擾。

      但經(jīng)過深入研究、探討和實踐驗證,找到了幾種在不重建索引的情況下實現(xiàn)字段"刪除"的方法。

      unsetunset2、分析問題unsetunset

      要理解為什么 Elasticsearch 不允許直接刪除 mapping 中的字段,需要從其底層存儲機(jī)制說起。

      Elasticsearch 基于 Lucene 構(gòu)建,Lucene 的段(Segment)設(shè)計是不可變的,這意味著已經(jīng)寫入的數(shù)據(jù)結(jié)構(gòu)無法直接修改。

      向索引中添加文檔時,字段信息會被寫入到段的元數(shù)據(jù)中,刪除字段意味著要修改所有相關(guān)段的結(jié)構(gòu),這在技術(shù)上是不可行的。

      從 Elasticsearch 的 mapping API 來看,可以添加新字段,也可以修改某些字段的屬性(如增加新的分析器),但確實無法刪除已存在的字段。這個設(shè)計雖然在某些場景下帶來不便,但保證了數(shù)據(jù)的一致性和系統(tǒng)的穩(wěn)定性。

      在生產(chǎn)環(huán)境中,通常面臨的場景包括:

      • 首先是歷史遺留字段清理,早期版本留下的無用字段占用存儲空間;

      • 其次是敏感數(shù)據(jù)刪除,某些包含敏感信息的字段需要從索引中移除;

      • 第三是性能優(yōu)化,減少不必要的字段可以提升查詢和存儲性能;

      • 最后是合規(guī)要求,某些行業(yè)規(guī)范要求定期清理特定類型的數(shù)據(jù)字段。

      unsetunset3、解決方案探討unsetunset

      經(jīng)過調(diào)研和實踐,總結(jié)出了幾種不重建索引就能實現(xiàn)字段"刪除"的方法,每種方法都有其適用場景和局限性。

      3.1 方案一:使用 _source 過濾實現(xiàn)邏輯刪除

      這是最簡單也是最常用的方法。通過修改索引模板或者在查詢時使用 _source 過濾,可以讓特定字段在結(jié)果中不可見。

      這種方法實際上并沒有物理刪除字段,而是在應(yīng)用層面屏蔽了這些字段。

      • 優(yōu)點是實施簡單,對現(xiàn)有數(shù)據(jù)無影響,可以隨時恢復(fù)。

      • 缺點是字段數(shù)據(jù)仍然存在,占用存儲空間,對存儲成本優(yōu)化效果有限。這種方法適用于臨時屏蔽字段或者測試環(huán)境。

      3.2 方案二:通過 Index Template 控制新數(shù)據(jù)

      對于持續(xù)寫入的索引,我們可以通過修改索引模板來控制新文檔不再包含特定字段(單獨索引也可以實現(xiàn))。

      雖然歷史數(shù)據(jù)中的字段仍然存在,但至少可以阻止問題繼續(xù)惡化。

      這種方法的優(yōu)勢在于操作安全,對現(xiàn)有數(shù)據(jù)無風(fēng)險,適合滾動索引場景。劣勢是只能控制新數(shù)據(jù),歷史數(shù)據(jù)問題依然存在,需要配合其他方案使用。

      3.3 方案三:利用 Ingest Pipeline 預(yù)處理

      在數(shù)據(jù)寫入階段使用 Ingest Pipeline 來刪除不需要的字段,這種方法可以在源頭解決問題。

      通過配置 remove 處理器,可以在文檔索引前就把指定字段移除(如下是官網(wǎng)截圖)。

      3.4 方案四:結(jié)合 alias 和新索引的漸進(jìn)遷移

      這是一種相對溫和的遷移策略。創(chuàng)建新的索引(不包含需要刪除的字段),然后通過別名逐步將流量切換到新索引。

      這種方法可以實現(xiàn)零停機(jī)遷移,但需要一定的規(guī)劃和協(xié)調(diào)。

      unsetunset4、解決問題實戰(zhàn)unsetunset

      接下來展示具體的實施步驟。

      假設(shè)我們有一個名為 user_behavior 的索引,需要刪除其中的 deprecated_field 和 temp_data 字段。

      針對第3部分討論的內(nèi)容,實戰(zhàn)如下:

      4.1 實戰(zhàn)場景一:使用 _source 過濾實現(xiàn)邏輯刪除

      首先查看當(dāng)前索引的 mapping 結(jié)構(gòu):

      PUT user_behavior
      {
      "mappings": {
          "properties": {
            "user_id": { "type""keyword" },
            "action": { "type""keyword" },
            "timestamp": { "type""date" },
            "deprecated_field": { "type""text" },
            "temp_data": { "type""object" }
          }
        }
      }


      POST _bulk
      "index" : { "_index" : "user_behavior""_id" : "1" } }{ "user_id""U1001""action""login""timestamp""2025-08-21T08:00:00Z""deprecated_field""old_session""temp_data": { "browser""Chrome""ip""192.168.1.1" }}{ "index" : { "_index" : "user_behavior""_id" : "2" } }{ "user_id""U1002""action""purchase""timestamp""2025-08-21T08:05:00Z""deprecated_field""legacy_cart""temp_data": { "items": 3, "amount": 49.99 }}{ "index" : { "_index" : "user_behavior""_id" : "3" } }{ "user_id""U1001""action""logout""timestamp""2025-08-21T08:10:00Z""deprecated_field""session_end""temp_data": { "duration": 600 }}{ "index" : { "_index" : "user_behavior""_id" : "4" } }{ "user_id""U1003""action""view""timestamp""2025-08-21T08:15:00Z""deprecated_field""page_load""temp_data": { "page""product""load_time": 1.2 }}{ "index" : { "_index" : "user_behavior""_id" : "5" } }{ "user_id""U1002""action""search""timestamp""2025-08-21T08:20:00Z""deprecated_field""query_log""temp_data": { "keyword""laptop""results": 15 }}

      GET user_behavior/_mapping

      假設(shè)返回的結(jié)果包含我們要刪除的字段:

      {
        "user_behavior": {
          "mappings": {
            "properties": {
              "user_id": {"type""keyword"},
              "action": {"type""keyword"},
              "timestamp": {"type""date"},
              "deprecated_field": {"type""text"},
              "temp_data": {"type""object"}
            }
          }
        }
      }

      在應(yīng)用層面實現(xiàn)字段過濾,通過查詢時指定 _source 參數(shù):

      GET user_behavior/_search
      {
        "_source": {
          "excludes": ["deprecated_field""temp_data"]
        },
        "query": {
          "match_all": {}
        }
      }

      image.png

      如果希望在索引級別設(shè)置默認(rèn)的 _source 過濾,可以通過 settings 配置。

      4.2 實戰(zhàn)場景二:通過 Ingest Pipeline 預(yù)處理新數(shù)據(jù)

      創(chuàng)建一個用于移除指定字段的 Ingest Pipeline:

      PUT _ingest/pipeline/remove_fields_pipeline
      {
      "description""Remove deprecated fields from documents",
      "processors": [
          {
            "remove": {
              "field""deprecated_field",
              "ignore_missing"true
            }
          },
          {
            "remove": {
              "field""temp_data",
              "ignore_missing"true
            }
          }
        ]
      }

      測試 Pipeline 是否正常工作:

      POST _ingest/pipeline/remove_fields_pipeline/_simulate
      {
        "docs": [
          {
            "_source": {
              "user_id""12345",
              "action""click",
              "timestamp""2024-01-01T10:00:00",
              "deprecated_field""should be removed",
              "temp_data": {"key""value"}
            }
          }
        ]
      }

      image.png

      將 Pipeline 應(yīng)用到索引的默認(rèn)處理流程:

      PUT user_behavior/_settings
      {
      "index.default_pipeline""remove_fields_pipeline"
      }



      POST user_behavior/_doc/6
      {
      "user_id""U1006",
      "action""search",
      "timestamp""2025-08-21T08:20:00Z",
      "deprecated_field""query_log",
      "temp_data": {
          "keyword""laptop",
          "results": 15
        }
      }

      GET user_behavior/_doc/6


      PUT user_behavior/_settings
      {
      "index": {
          "default_pipeline""remove_fields_pipeline"
        }
      }

      image.png

      4.3 實戰(zhàn)場景三:基于別名的漸進(jìn)遷移策略

      首先創(chuàng)建一個新的索引,mapping 中不包含需要刪除的字段:

      PUT user_behavior_v2
      {
        "mappings": {
          "properties": {
            "user_id": {"type""keyword"},
            "action": {"type""keyword"},
            "timestamp": {"type""date"}
          }
        }
      }

      創(chuàng)建別名指向原索引:

      POST _aliases
      {
        "actions": [
          {
            "add": {
              "index""user_behavior",
              "alias""user_behavior_alias"
            }
          }
        ]
      }

      使用 reindex API 將數(shù)據(jù)遷移到新索引,同時過濾掉不需要的字段:

      POST _reindex
      {
        "source": {
          "index""user_behavior",
          "_source": {
            "excludes": ["deprecated_field""temp_data"]
          }
        },
        "dest": {
          "index""user_behavior_v2"
        }
      }

      image.png

      監(jiān)控遷移進(jìn)度:

      GET _tasks?detailed=true&actions=*reindex

      遷移完成后,切換別名指向新索引:

      POST _aliases
      {
      "actions": [
          {
            "remove": {
              "index""user_behavior",
              "alias""user_behavior_alias"
            }
          },
          {
            "add": {
              "index""user_behavior_v2",
              "alias""user_behavior_alias"
            }
          }
        ]
      }

      4.4 實戰(zhàn)場景四:處理持續(xù)寫入的索引

      對于需要持續(xù)寫入數(shù)據(jù)的場景,可以使用滾動索引策略。首先修改索引模板:

      PUT _index_template/user_behavior_template
      {
      "index_patterns": ["user_behavior-*"],
      "template": {
          "mappings": {
            "properties": {
              "user_id": {"type""keyword"},
              "action": {"type""keyword"},
              "timestamp": {"type""date"}
            }
          },
          "settings": {
            "index.default_pipeline""remove_fields_pipeline"
          }
        }
      }

      配置 ILM 策略實現(xiàn)自動滾動:

      PUT _ilm/policy/user_behavior_policy
      {
      "policy": {
          "phases": {
            "hot": {
              "actions": {
                "rollover": {
                  "max_age""30d",
                  "max_size""50gb"
                }
              }
            }
          }
        }
      }

      unsetunset5、方案對比與選擇unsetunset

      在實際項目中,不同場景需要選擇不同的方案。對于開發(fā)和測試環(huán)境,推薦使用 _source 過濾方案,操作簡單且風(fēng)險低。

      對于生產(chǎn)環(huán)境中的小規(guī)模索引(數(shù)據(jù)量在 GB 級別),可以考慮使用別名切換的方式進(jìn)行一次性遷移。

      對于大規(guī)模生產(chǎn)環(huán)境,建議采用 Ingest Pipeline + 滾動索引的組合方案。這種方式雖然不能立即清理歷史數(shù)據(jù),但可以確保新數(shù)據(jù)不再包含不需要的字段,同時通過 ILM 策略逐步淘汰舊數(shù)據(jù)。

      在存儲成本敏感的場景下,如果歷史數(shù)據(jù)中不需要的字段占用空間很大,還是建議在業(yè)務(wù)低峰期執(zhí)行 reindex 操作。可以通過設(shè)置合適的 batch size 和 requests_per_second 參數(shù)來控制遷移速度,減少對業(yè)務(wù)的影響。

      unsetunset6、小結(jié)unsetunset

      通過實際項目的實踐發(fā)現(xiàn)雖然 Elasticsearch 不支持直接刪除 mapping 字段,但通過合理的設(shè)計和實施策略,完全可以實現(xiàn)字段的"邏輯刪除"。

      在球友項目中,最終采用了 Ingest Pipeline + update_by_query修改的組合方案,解決了開篇提到的問題。


      更多推薦

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章

        主站蜘蛛池模板: 疯狂做受XXXX高潮国产| 久久精品无码鲁网中文电影| 免费高清特级毛片A片| 亚洲国产精品自产在线播放| 国产成人精品中文字幕| 国产又黄又爽又刺激的免费网址 | 強壮公弄得我次次高潮A片 | 国产精品福利中文字幕| 日本公妇被公侵犯中文字幕| 成人无码午夜在线观看| 免费播放一区二区三区| 人妻一区二区三区三区| 一本久道久久综合狠狠爱| 成人无码潮喷在线观看| 色老头在线一区二区三区| 国产亚洲AV电影院之毛片| 无码人妻一区二区三区精品视频| 久久这里精品国产99丫E6| 亚洲午夜无码久久久久蜜臀av | 人人妻人人澡人人爽人人精品电影| 欧美白妞大战非洲大炮| 亚洲熟女乱色一区二区三区| 国产亚洲精品AA片在线爽| 久久精品国产亚洲AV忘忧草18| 无码成人午夜在线观看| 国产色无码精品视频免费| 夜色爽爽影院18禁妓女影院| 2020国产欧洲精品网站| 国产另类ts人妖一区二区| 国产色视频一区二区三区| 成人又黄又爽又色的视频| 久久精品娱乐亚洲领先| 久久伊人精品青青草原APP | 国产精品 视频一区 二区三区| 亚洲天堂在线观看完整版| 一本色道久久东京热| 美女内射毛片在线看免费人动物| 成 人影片免费观看| 在线高清免费不卡全码| 国产高清自产拍av在线| 波多野结衣中文字幕一区二区三区|