全部產品
Search
文件中心

Elasticsearch:開源Elasticsearch FAQ

更新時間:Aug 06, 2026

本文列舉了一些開源Elasticsearch(ES)相關的常見問題,例如,如何配置索引線程池大小,如何重新分配索引分區,如何大量刪除索引等。

常見問題概覽

如何配置索引線程池大小?

在YML參數配置中,指定thread_pool.write.queue_size參數的大小即可。具體操作步驟,請參見配置YML參數配置線程池大小

重要

對於6.x以下版本的Elasticsearch叢集,需要使用thread_pool.index.queue_size參數。

出現記憶體溢出OOM(OutOfMemory)的錯誤,如何處理?

通過以下命令清理緩衝,然後觀察具體原因,根據原因升配叢集或調整業務。

curl -u elastic:<password> -XPOST "localhost:9200/<index_name>/_cache/clear?pretty"

變數名

說明

<password>

Elasticsearch執行個體的密碼,為您在建立Elasticsearch執行個體時設定的密碼,或初始化Kibana時指定的密碼。

<index_name>

索引名稱。

如何手動對shard進行操作?

使用reroute API,或通過Cerebro進行操作。具體操作步驟,請參見Cluster reroute APICerebro

Elasticsearch的緩衝清除策略有哪些?

Elasticsearch支援以下三種緩衝清除策略:

  • 清除全部緩衝

    curl localhost:9200/_cache/clear?pretty
  • 清除單一索引緩衝

    curl localhost:9200/<index_name>/_cache/clear?pretty
  • 清除多索引緩衝

    curl localhost:9200/<index_name1>,<index_name2>,<index_name3>/_cache/clear?pretty

如何重新分配索引分區(reroute)?

當出現分區丟失、分區錯誤等分區問題時,您可以執行以下命令進行reroute操作。

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands" : [ {
        "move" :
            {
              "index" : "test", "shard" : 0,
              "from_node" : "node1", "to_node" : "node2"
            }
        },
        {
          "allocate" : {
              "index" : "test", "shard" : 1, "node" : "node3"
          }
        }
    ]
}'

索引查詢時,提示statusCode: 500的錯誤,如何處理?

建議您通過第三方外掛程式進行查詢(例如Cerebro):

  • 查詢正常:說明該錯誤大機率是由於索引名稱不規範引起的。規範的索引名稱只包含英文、底線和數字,您可以通過修改索引名稱來修複此問題。

  • 查詢不正常:說明索引或叢集本身存在問題。請確保叢集中存在該索引,且叢集處於正常狀態。

如何修改自動建立索引auto_create_index參數?

執行以下命令修改。

PUT /_cluster/settings
{
    "persistent" : {
        "action": {
          "auto_create_index": "false"
        }
    }
}
重要

auto_create_index參數的預設值為false,表示不允許自動建立索引。一般建議您不要調整該值,否則會引起索引太多、索引Mapping和Setting不符合預期等問題。

OSS快照大概需要多久?

在叢集的分區數、記憶體、磁碟和CPU等正常的情況下,80 GB的索引資料進行OSS快照,大約需要30分鐘。

建立索引時,如何設定分區數?

建議您將單個分區儲存索引資料的大小控制在30 GB以內,不要超過50 GB,否則會極大降低查詢效能。根據上述建議,最終分區數量 = 資料總量/30 GB。

適當提升分區數量可以提升建立索引的速度。分區數過多或過少,都會降低查詢速度,具體說明如下:

  • 分區數過多會導致需要開啟的檔案比較多。由於分區是儲存在不同機器上的,因此分區數越多,各個節點之間的互動也就越多,導致查詢效率降低。

  • 分區數過少會導致單個分區索引過大,降低整體的查詢效率。

自建Elasticsearch遷移資料,使用elasticsearch-repository-oss外掛程式遇到如下問題,如何解決?

問題:ERROR: This plugin was built with an older plugin structure. Contact the plugin author to remove the intermediate "elasticsearch" directory within the plugin zip

解決方案:將elasticsearch改名為elasticsearch-repository-oss, 然後複製到plugins目錄下。

如何調整Kibana可視化展示資料的時區?

您可以在Kibana中,通過轉換時區來調整伺服器時間,如下圖(以6.7.0版本為例)。調整伺服器時間1選擇時區如下圖所示。選擇時區

Elasticsearch的Term查詢適用於哪種類型的資料?

Term為單詞層級的查詢,這些查詢通常用於結構化的資料,例如number、date、keyword等,而不是text。

說明

全⽂文字查詢之前要先對常值內容進行分詞,而單詞層級的查詢直接在相應欄位的反向索引中精確尋找,單詞層級的查詢一般用於數值、日期等類型的欄位上。

使用ES的別名(aliases)功能需要注意哪些問題?

需要將別名裡索引的分區控制在1024個以內。

在查詢過程中,出現報錯too_many_buckets_exception,如何處理?

報錯:"type": "too_many_buckets_exception", "reason": "Trying to create too many buckets. Must be less than or equal to: [10000] but was [10001]

問題分析與解決方案:請參見控制彙總中建立的桶數。除了調整業務彙總的size大小,您還可以參見Increasing max_buckets for specific Visualizations來處理。

如何大量刪除索引?

預設情況下,Elasticsearch不允許大量刪除索引,需要通過以下命令手動開啟。開啟後,您可以通過萬用字元進行大量刪除操作。

PUT /_cluster/settings
{
  "persistent": {
     "action.destructive_requires_name": false
  }
}

script.painless.regex.enabled參數能否修改?

此參數預設值是false,不建議修改。如果要在painless指令碼中使用Regex,需要在elasticsearch.yml中設定script.painless.regex.enabled參數為true。由於Regex會消耗大量資源,官方不建議使用,因此沒有開啟此參數。

如何修改Elasticsearch的mapping、主分區和副本分區數量?

  • 已經建立的索引修改mapping,建議通過reindex重建索引。

    說明

    mapping中支援的欄位類型,請參見Data field type

  • 已經建立的索引無法修改主分區,建議通過reindex重建索引修改。

    說明

    建議您在建立索引前規劃好分區數,減少後期調整。

  • 已經建立的索引修改副本數,可以參考以下命令修改:

    PUT test/_settings
    {
      "number_of_replicas": 0
    }

ES如何設定儲存某個欄位?

_source欄位,預設情況下,ES不會單獨儲存欄位值。如果需要隔離儲存區 (Isolated Storage)某些欄位,可以在索引的映射中將欄位的store屬性設定為true。

說明

ES的_source欄位包含原始JSON文檔,提供了從原始文檔檢索任何欄位的能力。通常不推薦開啟欄位儲存,以免增加磁碟空間的使用。

以儲存my_field欄位為例:

PUT / my_index {
	"mappings": {
		"properties": {
			"my_field": {
				"type": "text",
				"store": true
			}
		}
	}
}

ES如何設定某個欄位是否可以參與彙總?

欄位是否可以彙總通常取決於欄位的類型和是否有相關的欄位資料(doc_values或fielddata)可用。

  • 數字欄位、日期欄位和keyword類型欄位,預設使用doc_values,預設情況下可以彙總。

    說明

    doc_values是專為排序、彙總和指令碼操作最佳化的列儲存格式。

  • text類型欄位,預設情況下不支援彙總。如果您需要對text欄位進行彙總,必須在映射中啟用fielddata。

    說明

    開啟fielddata會顯著增加記憶體使用量,因為它會把所有的文本資料載入到記憶體中。

    PUT /my_index{
      "mappings": {
        "properties": {
          "my_text_field": {
            "type": "text",
            "fielddata": true
          }
        }
      }
    }
  • 如果您不希望某個欄位參與彙總,可以根據您的應用邏輯選擇以下任一方式:

    • 通過設定enabled屬性為false來排除整個對象欄位。

    • 選擇不將非彙總欄位包含在文檔中。

配置ES時遇到報錯Unknown char_filter type [stop] for ** ,如何處理?

在配置ES時遇到報錯Unknown char_filter type [stop] for ** ,表明您嘗試在char_filter部分使用stop類型,但實際上stop是一個Token Filter而非Character Filter

解決方案如下:

  • 更正配置位置:如果您意圖使用停用詞過濾器,請將stop配置移至analyzer配置的filter部分,而非char_filter。停用詞過濾器用於從Token流中移除指定的停用詞列表中的詞語。

    樣本:

    "settings": {
     "analysis": {
       "analyzer": {
          "my_custom_analyzer": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": [       // 正確位置:在filter數組內
              "lowercase",
              "stop"        // 使用stop Token Filter
            ]
          }
       },
       "filter": {          // 定義stop Token Filter的具體配置(如有必要)
          "stop": {
            "type": "stop",
            "stopwords": "_english_" // 或自訂停用詞列表
          }
       }
     }
    }
    
  • 檢查類型名稱:確認其他配置如tokenizerchar_filter中是否正確的指定類型名稱,避免類似的類型誤用。

    請根據您的實際需求調整配置,確保char_filtertokenizerfilter各部分都使用了正確的組件類型。

凍結索引後磁碟空間未減少,如何釋放空間?

凍結索引(freeze)只是將索引設為唯讀並釋放堆記憶體以減少資源佔用,索引的資料檔案仍保留在磁碟上,因此磁碟空間不會減少。

如需釋放磁碟空間,可以通過以下方式操作:

  • 直接刪除凍結狀態的索引

    凍結狀態的索引可以直接刪除,無需先解凍。執行以下命令刪除指定的凍結索引:

    DELETE /<frozen_index_name>

    <frozen_index_name>替換為實際的凍結索引名稱。刪除索引會永久移除索引的所有資料和中繼資料,磁碟空間隨之釋放。

  • 刪除部分文檔後強制合并

    如果只需要釋放部分空間而非刪除整個索引,先解凍索引,使用_delete_by_query刪除不需要的文檔,再執行_forcemerge強制合并segment以回收磁碟空間:

    POST /<index_name>/_delete_by_query
    {
      "query": {
        "match": {
          "<field>": "<value>"
        }
      }
    }
    POST /<index_name>/_forcemerge?only_expunge_deletes=true

    _delete_by_query會將文檔標記為已刪除但不立即釋放磁碟空間,_forcemerge會合并segment並物理刪除已標記的文檔,從而真正釋放磁碟空間。

如何判斷當前配置的 Elasticsearch 預先處理管道是 default_pipeline 還是 final_pipeline?

Elasticsearch 的 Ingest Pipeline 支援兩種索引層級的管道配置:default_pipelinefinal_pipeline,兩者在作用階段和優先順序上有所不同。

  • default_pipeline:在文檔索引前執行的預先處理管道。如果索引請求中未通過 pipeline 參數指定其他管道,則使用該管道處理文檔。索引請求可以通過 pipeline 參數覆蓋 default_pipeline 的設定。

  • final_pipeline:在所有其他管道(包括 default_pipeline 和請求中指定的 pipeline)執行完成後執行的管道。final_pipeline 無法被覆蓋,始終作為最後一步執行。

執行以下命令查看索引當前配置的管道類型:

GET <index_name>/_settings?filter_path=**.default_pipeline,**.final_pipeline

返回結果樣本:

{
  "<index_name>": {
    "settings": {
      "index": {
        "default_pipeline": "my_default_pipeline",
        "final_pipeline": "my_final_pipeline"
      }
    }
  }
}

如果返回結果中包含 default_pipeline 欄位,說明該索引配置了預設預先處理管道;如果包含 final_pipeline 欄位,說明配置了最終處理管道。未返回的欄位表示該索引未配置對應類型的管道。

說明

也可以通過 GET <index_name>/_settings 查看索引的完整配置,在返回的 settings.index 中尋找 default_pipelinefinal_pipeline 欄位。

如何使用 Elasticsearch scroll 查詢進行大量資料檢索?

scroll 查詢適用於需要檢索大量資料的情境(如全量資料匯出或批量處理),通過保持搜尋上下文來分批擷取資料。scroll 不適用於即時搜尋情境,即時查詢建議使用常規 search API。使用步驟如下:

  1. 發起初始 scroll 查詢,指定 scroll 上下文保持時間(如 1 分鐘):

    POST /<index_name>/_search?scroll=1m
    {
      "size": 1000,
      "query": {
        "match_all": {}
      }
    }

    從返回結果中擷取 _scroll_id,用於後續的資料拉取。

  2. 使用 _scroll_id 擷取下一批資料:

    POST /_search/scroll
    {
      "scroll": "1m",
      "scroll_id": "<上一步返回的_scroll_id>"
    }
  3. 重複執行步驟 2,每次使用最新返回的 _scroll_id,直到返回結果中的 hits.hits 數組為空白,表示資料已全部檢索完畢。

  4. 檢索完成後,清除 scroll 上下文以釋放叢集資源:

    DELETE /_search/scroll
    {
      "scroll_id": "<_scroll_id>"
    }
說明

scroll 參數指定的是每次 scroll 請求之間的最大等待時間,而非整個查詢的逾時時間。每次執行 scroll 請求都會重新整理該逾時計時器。size 參數控制每批返回的文檔數量,建議根據單條文檔大小合理設定,避免單次返回資料量過大。

如何在 Kibana 中找到角色管理入口或修改索引 Mapping?

角色管理

通過阿里雲 Elasticsearch 控制台的可視化控制台入口登入 Kibana 後,在左側導覽列選擇 Stack Management > Security > Roles,即可進行角色的建立、編輯和刪除操作。

修改索引 Mapping

非日誌增強版 Elasticsearch 執行個體不支援在阿里雲 Elasticsearch 控制台直接修改索引 Mapping,需要通過 Kibana 操作。登入 Kibana 後,在左側導覽列選擇 Stack Management > Index Management,找到目標索引後,通過 Dev Tools 執行 PUT mapping 請求添加欄位。樣本如下:

PUT /<index_name>/_mapping
{
  "properties": {
    "new_field": {
      "type": "keyword"
    }
  }
}
重要

Elasticsearch 僅支援向已有索引新增欄位,不支援修改或刪除已有欄位的類型。如需修改已有欄位類型,需要建立新索引並通過 reindex 遷移資料,具體操作可參考本文「如何修改 Elasticsearch 的 mapping、主分區和副本分區數量?」章節。