本文列舉了一些開源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"
變量名 | 說明 |
| 阿里云Elasticsearch實例的密碼,為您在創建Elasticsearch實例時設置的密碼,或初始化Kibana時指定的密碼。 |
| 索引名稱。 |
如何手動對shard進行操作?
使用reroute API,或通過Cerebro進行操作。具體操作步驟,請參見Cluster reroute API和Cerebro。
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版本為例)。選擇時區如下圖所示。
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腳本中使用正則表達式,需要在elasticsearch.yml中設置script.painless.regex.enabled參數為true。由于正則表達式會消耗大量資源,官方不建議使用,因此沒有打開此參數。
如何修改Elasticsearch的mapping、主分片和副本分片數量?
已經創建的索引修改mapping,建議通過reindex重建索引。
說明mapping中支持的字段類型,請參見Data field type。
已經創建的索引無法修改主分片,建議通過reindex重建索引修改。
說明建議您在創建索引前規劃好分片數,減少后期調整。
已經創建的索引修改副本數,可以參考以下命令修改:
PUT test/_settings { "number_of_replicas": 0 }
ES如何設置存儲某個字段?
除_source
字段,默認情況下,ES不會單獨存儲字段值。如果需要獨立存儲某些字段,可以在索引的映射中將字段的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_" // 或自定義停用詞列表 } } } }
檢查類型名稱:確認其他配置如
tokenizer
或char_filter
中是否正確的指定類型名稱,避免類似的類型誤用。請根據您的實際需求調整配置,確保
char_filter
、tokenizer
和filter
各部分都使用了正確的組件類型。