Site icon Mr. 沙先生

Elasticsearch 棄用 string,並且 text 不支援 sort 排序

最近在搞公司的 Elasticsearch 弄的頭昏眼花,主要希望換掉舊的 Elasticsearch,但是在過程中踩了一堆坑 …

這次遇到的問題是在 Logstash filter 切出來的 field 在 Kibana 上面都沒有 sort,但是舊版 Kibana 3.x 不用特別處理就可以有 sort 的功能。

正常狀況下,會有箭頭可以讓你 sort 排序,但是 Logstash 切出來的 field sort 箭頭卻不見了

花了一個早上 Google 找了一堆文件發現 Elasticsearch 在 5.x 的時候就棄用 string 改成 text,所以在 Kibana 上預設的 template 用 match_mapping_type 把 送來的 string 轉成 text 格式 …

GET _template/

{
  "mappings": {
    "_default_": {
      "dynamic_templates": [
        {
          "message_field": {
            "path_match": "message",
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "norms": false
            }
          }
        },
        {
          "string_fields": {
          "match": "logstash-*",
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "norms": false,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    ]
  }
}

在上面可以看到當 index 符合預設的 logstash-* 時,只要 type 為 string 就會被 match_mapping_type 轉成 text,但 field.keyword 為了要讓你可以 Query 所以 Data type 不是 text。

然後 Elasticsearch 6.x 開始 text 就不允許 sort,所以導致我從 Logstash 切出來的 field 都變成 text 進而不能 sort。

要解決可以直接修改 template 讓 string 進來不是轉成 text,而是 keyword (或其他 Data type)

PUT _template/defaultKeyword
{
  "order": 0,
  "index_patterns": ["*"],
  "settings": {
    "index": {
      "refresh_interval": "5s"
    }
  },
  "mappings": {
    "_default_": {
      "dynamic_templates": [
        {
          "message_field": {
            "path_match": "message",
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
              "norms": false
            }
          }
        },
        {
          "string_fields": {
            "match": "*",
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword",
              "norms": false,
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        }
      ],
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "@version": {
          "type": "keyword"
        },
        "geoip": {
          "dynamic": true,
          "properties": {
            "ip": {
              "type": "ip"
            },
            "location": {
              "type": "geo_point"
            },
            "latitude": {
              "type": "half_float"
            },
            "longitude": {
              "type": "half_float"
            }
          }
        }
      }
    }
  }
}

index_patterns 要特別注意是否有符合你的 index name,最後 rebuild index 就會生效新的 data type 囉。

參考資料:

Exit mobile version