ES 實戰複雜sql查詢、修改欄位型別

2023-07-15 15:00:35

轉載請註明出處:

1.查詢索引得 mapping 與 setting

 

  get 直接查詢 索引名稱時,會返回 該 索引得 mapping 和 settings 得設定,上述返回得結構如下:

{
  "terra-syslog_2023-07-12" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        },
        "@version" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "host" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "message" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "received_at" : {
          "type" : "date"
        },
        "received_from" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "syslog_facility" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "syslog_facility_code" : {
          "type" : "long"
        },
        "syslog_hostname" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "syslog_message" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "syslog_program" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "syslog_severity" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "syslog_severity_code" : {
          "type" : "long"
        },
        "syslog_timestamp" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "type" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "user" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1689137630855",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "Qew4uoNUQ9q8-JQDPTWVPw",
        "version" : {
          "created" : "7080199"
        },
        "provided_name" : "terra-syslog_2023-07-12"
      }
    }
  }
}
View Code

2. 執行復雜條件得查詢:

   該dsl 為:

GET terra-syslog_2023-07-15/_search

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "syslog_program.keyword": {
              "wildcard": "*SSH_USER_LOGIN*",
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "aggregations": {
    "time_agg": {
      "date_histogram": {
        "field": "received_at",
        "format": "EEE",
        "fixed_interval": "1d",
        "offset": 0,
        "order": {
          "_key": "asc"
        },
        "keyed": false,
        "min_doc_count": 0
      },
      "aggregations": {
        "user_agg": {
          "terms": {
            "field": "user.keyword",
            "size": 10,
            "min_doc_count": 1,
            "shard_min_doc_count": 0,
            "show_term_doc_count_error": false,
            "order": [
              {
                "_count": "desc"
              },
              {
                "_key": "asc"
              }
            ]
          }
        }
      }
    }
  }
}

這段 DSL 具有以下作用:

  1. "size": 0: 設定返回的結果集大小為 0,即只返回聚合結果,不返回匹配的檔案。

  2. query 部分:構建了一個布林查詢,包含多個 existsrange 子查詢,用於過濾符合條件的檔案。

    • exists 子查詢檢查指定欄位是否存在,這裡依次檢查了 source.ipsource.portdestination.ipdestination.porthost.nameflow.rep_tags 欄位的存在。

    • range 子查詢指定了對 @timestamp 欄位進行範圍篩選,從給定的時間戳範圍中選擇滿足條件的檔案。

  3. aggregations 部分:定義了聚合操作,通過 terms 聚合按照 host.name 欄位進行分組,並計算每個組內的檔案數。

    • terms 聚合將按照 host.name 欄位的值進行分組。設定 size 為最大整數 2147483647,以確保返回所有分組。

    • min_doc_count 設定為 1,表示只返回至少擁有一個檔案的分組。

    • shard_min_doc_count 設定為 0,表示在單個分片上沒有要求檔案數量的最小要求。

    • show_term_doc_count_error 設定為 false,不顯示術語檔案計數錯誤。

    • order 指定了排序規則,首先按照分組中的檔案數 _count 降序排序,然後按照 host.name 欄位的值升序排序。

    • terms 聚合內部定義了一個子聚合 cardinality,用於計算每個分組內唯一組合的數量。這裡通過拼接 source.ipsource.portdestination.ipdestination.port 欄位的值來作為唯一標識。

  該 DSL 查詢的作用是在給定時間範圍內,統計滿足一系列條件(存在指定欄位)的檔案,並按照 host.name 進行分組並計算每個組內唯一組合的數量。

  另外,在查詢時,使用 _search 可以執行DSL, 如果沒有_search 時,可以查詢該索引得檔案結構型別,以及該索引得副本、分片等資訊

3.修改 該 索引得 mapping 中得欄位型別

  將前面的對映中的 syslog_timestamp 欄位型別修改為日期型別(date),需要更新對映定義並重新建立索引。  

  1. 刪除現有的索引,或者建立一個新的索引。

  2. 更新對映定義,將 syslog_timestamp 的型別更改為 "date"。以下是更新後的對映範例:

{
  "mappings": {
    "_doc": {
      "properties": {
        // 其他欄位...
        "syslog_timestamp": {
          "type": "date"
        },
        // 其他欄位...
      }
    }
  }
}
  1. 使用上述修改後的對映定義來建立索引或更新現有索引的對映。可以使用 Elasticsearch 的 RESTful API 或管理工具(如 Kibana Console)執行以下請求:
PUT terra-syslog_2023-07-15
{
  "mappings": {
    "_doc": {
      "properties": {
        // 其他欄位...
        "syslog_timestamp": {
          "type": "date"
        },
        // 其他欄位...
      }
    }
  }
}

  這樣,syslog_timestamp 欄位的型別就會被修改為日期型別,並可以儲存、索引和查詢日期值。根據資料的格式和需求,Elasticsearch 會自動解析日期字串並將其轉換為適當的日期物件。