1. 程式人生 > 其它 >Elasticsearch Mapping欄位未支援索引導致搜尋失效問題處理

Elasticsearch Mapping欄位未支援索引導致搜尋失效問題處理

問題描述:

生產上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