Elasticsearch Mapping欄位未支援索引導致搜尋失效問題處理
阿新 • • 發佈:2022-12-01
問題描述:
生產上Es根據一個時間欄位搜尋,卻沒有返回資料
問題分析:
根據命令:
GET indexName/_mapping 檢視
#GET indexName/ _mapping { "indexName": { "mappings": { "properties": { "channel_source": { "type": "integer" }, "content_id": { "type": "integer" }, "count_name": { "type": "integer", **"index": false** }, "count_type": { "type": "integer" }, "insert_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "pv": { "type": "integer" } } } } }
count_name設定了 "index": false導致根據該欄位搜尋導致索引不生效。
ES的mappings定義好了生成索引後是不支援修改現有的欄位的,只能新增屬性。
解決方案
使用reindex命令處理
1、執行命令:GET indexName拿到索引的mappings和settings
(不要遺漏了settings屬性)
{ "indexName" : { "aliases" : { }, "mappings" : { "properties" : { "channel_source" : { "type": "integer" }, "content_id" : { "type" : "integer" }, "count_name" : { "type" : "integer", "index" : false }, "count_type" : { "type" : "integer" }, "insert_time" : { "type" : "date","format" : "yyyy-MM-dd HH:mm:ss" }, "pv" : { "type" : "integer" } } }, "settings" : { "index" : { "refresh_interval" : "1s", "number_of_shards" : "3", "translog" : { "flush_threshold_size" : "1024m", "sync_interval" : "120s", "durability" : "async" }, "provided_name" : "indexName", "max_result_window" : "10000", "creation_date" : "1648546177107", "number_of_replicas" : "3", "uuid" : "SkIOphVHQhq9hLbkxrQgwQ", "version" : { "created" : "7010099" } } } } }
2、根據PUT命令建立indexName_new
**注意需要去除對應欄位下的("index" : false)**
PUT indexName_new { "mappings" : { "properties" : { "channel_source" : { "type" : "integer" }, "content_id" : { "type" : "integer" }, "count_name" : { "type" : "integer" }, "count_type" : { "type" : "integer" }, "insert_time" : { "type" : "date" }, "pv" : { "type" : "integer" } } }, "settings" : { "index" : { "refresh_interval" : "1s", "number_of_shards" : "3", "translog" : { "flush_threshold_size" : "1024m", "sync_interval" : "120s", "durability" : "async" } } } }
3、建立成功後,執行reindex命令
POST _reindex { "source": { "index": "indexName" }, "dest": { "index": "indexName_new" } }
4、查詢一下indexName_new對應欄位的搜尋是否好了
GET /indexName_new/_search { "query": { "match_all": {} } }
5、設定索引別名或索引再次替換都可以
(1)設定該索引(indexName_new)別名為indexName
PUT indexName_new/_alias/indexName
或
POST /_aliases { "actions": [ { "add": { "index": "indexName_new", "alias": "indexName" } } ] }
查詢索引別名
POST /_aliases { "actions": [ { "add": { "index": "indexName_new", "alias": "indexName" } } ] }
(2)刪除indexName,然後根據上述步驟重新建立indexName,然後reindex indexName_new資料到indexName,最後刪除indexName_new即可
1、刪除原有indexName索引:
DELETE indexName
2、新增indexName
PUT indexName { "mappings" : { "properties" : { "channel_source" : { "type" : "integer" }, "content_id" : { "type" : "integer" }, "count_name" : { "type" : "integer" }, "count_type" : { "type" : "integer" }, "insert_time" : { "type" : "date" }, "pv" : { "type" : "integer" } } }, "settings" : { "index" : { "refresh_interval" : "1s", "number_of_shards" : "3", "translog" : { "flush_threshold_size" : "1024m", "sync_interval" : "120s", "durability" : "async" } } } }
3、reindex
POST _reindex { "source": { "index": "indexName_new" }, "dest": { "index": "indexName" } }
4、查詢reindex後的索引,確認資料沒問題
GET indexName/_search { "query": { "match_all": {} } }
也可以根據查詢總條數等多種方式校驗
5、刪除indexName_new
DELETE indexName_new