1. 程式人生 > >Elasticsearch Mapping設定

Elasticsearch Mapping設定

Mapping類似資料庫中的表結構定義,主要作用如下:

  • 定義Index下的欄位名(Field Name)
  • 定義欄位的型別,比如資料型、字串型、布林型等
  • 定義倒排索引相關配置,比如是否索引、記錄position等

自定義mapping:

Mapping中欄位型別一旦設定後,禁止直接修改(Lucene實現的倒排索引生成後不允許修改)
重新建立新的索引,然後做reindex操作
允許新增欄位
通過dynamic引數來控制欄位的新增

  • true:預設值,允許自動新增欄位
  • false:不允許自動新增欄位,但是文件可以正常寫入,但無法對欄位進行查詢等操作
  • strict:文件不能寫入,報錯

通過例項來演示dynamic引數的用法:

#定義索引,定義title、name、age三個欄位型別,對於其他新增欄位dynamic設定為false
PUT  myindex
{
  "mappings": {
    "doc": {
      "dynamic": false, 
      "properties": {
        "title": {
          "type": "text"
        },
        "name": {
          "type": "keyword"
        },
        "age": {
          "type"
: "integer" } } } } } #檢視剛才自定義的mapping GET myindex/_mapping #索引一條文件,欄位title、desc,其中desc為新增欄位 PUT myindex/doc/1 { "title": "hello world", "desc": "nothing" } #使用title欄位查詢,一切正常 GET myindex/_search { "query": { "match": { "title": "hello" } } } #無法使用desc欄位進行查詢,返回為0
GET myindex/_search { "query": { "match": { "desc": "nothing" } } }

這裡寫圖片描述

引數說明
(一)index:控制當前欄位是否索引,預設為true,即記錄索引,false不記錄,即不可搜尋

PUT  myindex
{
  "mappings": {
    "doc": {
      "properties": {
        "cookie": {
          "type": "text",
          "index":false 
        }
      }
    }
  }
}
#使用cookie欄位查詢會報錯

(二)index_options:用於控制倒排索引記錄的內容,有如下4種配置

  • docs: 只記錄doc id
  • freqs: 記錄doc id 和term frequencies
  • positions: 記錄doc id、term frequencies和term position
  • offsets: 記錄doc id、term frequencies、term position和character offsets

text型別預設配置為positions,其他預設為docs
記錄內容越多,佔用空間越大。

PUT  myindex1
{
  "mappings": {
    "doc": {
      "properties": {
        "cookie": {
          "type": "text",
          "index_options": "offsets" 
        }
      }
    }
  }
}   

(三)null_value: 當欄位遇到null值時的處理策略,預設為null,即空值,此時es會忽略該值。可以通過設定該值設定欄位的預設值

PUT  myindex1
{
  "mappings": {
    "doc": {
      "properties": {
        "status_code": {
          "type": "keyword",
          "null_value": "NULL" 
        }
      }
    }
  }
}       

資料型別

核心資料型別:

  • 字串型:text、keyword
  • 數值型:long、integer、short、byte、double、float、half_float、scaled_float
  • 日誌型別:date
  • 布林型別:boolean
  • 二進位制型別:binary
  • 範圍型別:integer_range、float_range、long_range、double_range、date_range

複雜資料型別:

  • 屬組型別:array
  • 物件型別:object
  • 巢狀型別:nested object

地理位置資料型別:

  • geo_point
  • geo_shape

專用型別:

  • 記錄IP地址 ip
  • 實現自動補全 completion
  • 記錄分詞數 token_count
  • 記錄字串hash值 murmur3
  • percolator
  • join

multi-fields多欄位特性
允許對同一個欄位採用不同的配置,比如分詞,常見的例子如對人名實現拼音搜尋,只需要在人名中新增一個子欄位為pinyin即可。

PUT  myindex1
{
  "mappings": {
    "doc": {
      "properties": {
        "username": {
          "type":"text",
          "fields": {
            "pinyin": {
              "type": "text",
              "analyzer": "pinyin"
            }
          }
        }
      }
    }
  }
}       

GET myindex1/_search
{
  "query": {
    "match": {
      "username.pinyin": "hanhan"
    }
  }
}       

Dynamic Mapping

動態欄位對映

es可以自動識別文件欄位型別,從而降低使用者使用成本,如下所示:
這裡寫圖片描述
es自動識別age為long型別,username為text型別
es是依靠JSOn文件的欄位型別來實現自動識別字段型別,支援的型別如下:
這裡寫圖片描述
驗證es自動識別:

PUT my_index2/doc/1
{
  "username": "user1",
  "age":14,
  "birth":"1988-10-10",
  "married": false,
  "year": "18",
  "tags": ["boy","fashion"],
  "money":100.1
}   

這裡寫圖片描述

Dynamic日期與數字識別

日期識別:

預設是[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
"strict_date_optional_time"是ISO datetime的格式,完整格式類似為:YYYY-MM-DDThh:mm:ssTZD(eg 1997-07-16T19:20:30+01:00)

dynamic_date_formats可以自定義日期型別
date_detection可以關閉日期自動識別的機制
這裡寫圖片描述

PUT my_index
{
  "mappings": {
    "my_type":{
      "dynamic_date_formats": ["yyyy-MM-dd"]
    }
  }
}

PUT my_index/my_type/1
{
  "create_date": "2015-09-02"
}

GET my_index/_mapping       

數字識別:
字串是數字時,預設不會自動識別為整型,因為字串中出現數字數完全合理的
numeric_detection可以開啟字元創中數字的自動識別功能。如下所示:
這裡寫圖片描述

PUT my_index
{
  "mappings": {
    "my_type":{
      "numeric_detection":"true"
    }
  }
}

PUT my_index/my_type/1
{
  "my_float": "1.0",
  "my_integer": "1"
}

GET my_index/_mapping

動態模板

允許根據es自動識別的資料型別、欄位名等動態設定欄位型別,可以實現如下效果:

  • 所有字串都設定為keyword型別,即預設不分詞
  • 所有以message開頭欄位都設定為text型別,即分詞
  • 所有以long_開頭的欄位都設定為long型別
  • 所有自動匹配為double型別的都設定為float型別,以節省空間

這裡寫圖片描述
匹配規則一般有如下幾個引數:

  • match_mapping_type: 匹配es自動識別的欄位型別,如boolean,long,string等
  • match,unmatch:匹配欄位名
  • path_match,path_unmatch: 匹配路徑

Dynamic Template API
(一)設定字串預設使用keyword型別

es預設會為字串設定為text型別,並增加一個keyword的子欄位

這裡寫圖片描述

PUT test_index
{
  "mappings": {
    "doc": {
      "dynamic_templates": [
          {
            "strings_as_keywords": {
              "match_mapping_type": "string",
              "mapping":{
                "type": "keyword"
              }
            }
          }
        ]
    }
  }
}

PUT test_index/doc/1
{
  "name": "alfred"
}

GET test_index/_mapping     

(二)設定以message開頭的欄位都設定為text型別 (順序由上而下)

PUT test_index
{
  "mappings": {
    "doc": {
      "dynamic_templates": [
          {
            "message_as_text": {
              "match_mapping_type": "string",
              "match": "message*",
              "mapping":{
                "type": "text"
              }
            }
          },
          {
            "strings_as_keywords": {
              "match_mapping_type": "string",
              "mapping":{
                "type": "keyword"
              }
            }
          }          
        ]
    }
  }
}

自定義mapping建議

自定義mapping的操作步驟如下:

  1. 寫入一條文件到es的臨時索引中,獲取es自動生成的mapping
  2. 修改步驟1得到的mapping,自定義相關配置
  3. 使用步驟2的mapping建立實際所需索引

(一)索引一條文件到es的臨時索引中,並檢視預設mapping:

PUT test_index/doc/1
{
  "referer": "-",
  "response_code": "200",
  "remote_ip": "192.168.20.200",
  "method": "POST",
  "user_name": "-",
  "http_version": "1.1",
  "body_sent": {
    "bytes": "0"
  },
  "url": "/analyzevideo"
}       

這裡寫圖片描述
預設會為字串設定為text型別,並增加一個keyword的子欄位
(二)根據預設的mapping進行自定義修改:
設定bytes欄位型別為long,url欄位型別為text,其餘欄位型別為keyword

PUT test_index
{
    "mappings": {
      "doc": {
        "properties": {
          "body_sent": {
            "properties": {
              "bytes": {
                "type": "long"
              }
            }
          },
          "http_version": {
            "type": "keyword"
          },
          "method": {
            "type": "keyword"
          },
          "referer": {
            "type": "keyword"
          },
          "remote_ip": {
            "type": "keyword"
          },
          "response_code": {
            "type": "keyword"
          },
          "url": {
            "type": "text"
          },
          "user_name": {
            "type": "keyword"
          }
        }
      }
    }
}   

這裡寫圖片描述
(3)使用動態模板對上邊自定義的mapping做進一步優化

PUT test_index
{
    "mappings": {
      "doc": {
       "dynamic_templates": [
          {
            "strings_as_keywords": {
              "match_mapping_type": "string",
              "mapping":{
                "type": "keyword"
              }
            }
          }
        ],
        "properties": {
          "body_sent": {
            "properties": {
              "bytes": {
                "type": "long"
              }
            }
          },
          "url": {
            "type": "text"
          }
        }
      }
    }
}   

這裡寫圖片描述

索引模板

索引模板:英文為 Index Template,主要用於在新建索引時自動應用預先設定的配置,簡化索引建立的操作步驟。

  • 可以設定索引的配置和mapping
  • 可以有多個模板,根據order設定,order大的覆蓋小的配置

索引模板API:
索引模板API,endpoint_template,如下所示:
這裡寫圖片描述