ES Mapping ,1 欄位型別

問簡發表於2020-11-24

mapping

對映是定義一個文件以及其所包含的欄位如何被儲存和索引的方法。

  • 動態對映(dynamic mapping)
  • 顯式對映(explicit mappings)

maping 建立

PUT index1
{
	"mappings":{
		//mapping 定義在這裡
	}
}

一 基本型別

欄位型別定義關鍵字
字串full-text , keywords
數值long , integer , short , byte , double ,float
日期long , int
布林false , “false”, “off”, “no”, “0”, “” (empty string), 0, 0.0 。
二進位制binary 二進位制型別以 Base64 編碼方式接收一個二進位制值,二進位制型別欄位預設不儲存,也不可搜尋。

1. 字串

字串型別被分為兩種情況:full-text 和 keywords。
full-text 表示欄位內容會被分析,而 keywords 表示欄位值只能作為一個精確值查詢。
string 型別5.x被廢棄

引數:
analyzer、boost、doc_values、fielddata、fields、ignore_above、include_in_all、index、index_options、norms、null_value、position_increment_gap、store、search_analyzer、search_quote_analyzer、similarity、term_vector

2. 數值

數值型別包括: long, integer, short, byte, double, float 。

引數:
coerce、boost、doc_values、ignore_malformed、include_in_all、index、null_value、precision_step、store

3. 日期

JSON 本身並沒有日期資料型別,在 ES 中的日期型別可以是:

  • 類似 “2015-01-01” or “2015/01/01 12:10:30” 的字串
  • long 型別的毫秒級別的時間戳
  • int 型別的秒級別的時間戳

日期型別預設會被轉換為 UTC 並且轉換為毫秒級別的時間戳的 long 型別儲存。
日期型別如果不指定 format ,將會以預設格式表示。

日期格式可以自定義,如果沒有自定義,預設格式如下:

"strict_date_optional_time||epoch_millis"

引數:
boost、doc_values、format、ignore_malformed、include_in_all、index、null_value、precision_step、store

4. 布林

布林假: false, “false”, “off” , “no”
, “” (empty string)
, “0”
, 0
, 0.0
布林真: 任何不為假的值

像 terms aggregation 聚合,是使用 1 和 0 來作為 key 的,key_as_string 則是用字串 true 和 false
布林型別的值,在 scripts 中則始終返回 1 或 0

引數:
boost、doc_values、index、null_value、store

5. 二進位制, binary

二進位制型別以 Base64 編碼方式接收一個二進位制值,二進位制型別欄位預設不儲存,也不可搜尋。
引數:doc_values、store

二 複雜型別

欄位型別定義關鍵字
物件
陣列
物件陣列
巢狀(nested)

1. 物件

PUT my_index/my_type/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}
// 轉換為
{
  "region":   "US",
  "manager.age": 30,
  "manager.name.first": 	"John",
  "manager.name.last":  	"Smith"  		//層級結構被以 "." 來表示。
}

2. 陣列

陣列型別,要求陣列元素的資料型別必須一致。

字串陣列: [ “one”, “two” ]
數字陣列: [ 1, 2 ]
陣列陣列: [ 1, [ 2, 3 ]] which is the equivalent of [ 1, 2, 3 ]
物件陣列: [ { “name”: “Mary”, “age”: 12 }, { “name”: “John”, “age”: 10 }]

陣列元素的資料型別,將會由其第一個元素的資料型別決定。
物件陣列,在 ES 內部將會被轉換為 “多值” 的扁平資料型別。後面將會詳解這一點。

例如:

PUT my_index/my_type/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}
// 轉換為
{
  "group" :        "fans",
  "user.first" : [ "alice", "john" ],
  "user.last" :  [ "smith", "white" ]
}

3. 物件陣列

物件陣列在 ES 內部,會把所有陣列元素(即物件)合併,物件中的每一個欄位被索引為一個 “多值” 欄位。
這將導致每個陣列元素(物件)內部的欄位關聯性丟失,解決的方法是使用 nested 型別。

例如:

PUT my_index/my_type/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": [
    { 
      "first": "John",
      "last":  "Smith"
    },
    { 
      "first": "Bob",
      "last":  "Leo"
    }
    ]
  }
}


// 轉換為:
{
  "region":             "US",
  "manager.age":        30,
  "manager.name.first": "John Bob",
  "manager.name.last": "Smith Leo" 
}


// 如果我們搜尋:
"bool": {
      "must": [
        { "match": { "manager.name.first": "John" }},   // John Smith
        { "match": { "manager.name.last": "Leo"}}       // Bob Leo
      ]
}

//這將會導致導致文件被命中,顯然,John Smith 、Bob Leo 兩組欄位它們內在的關聯性都丟失了
引數:

dynamic、enabled、include_in_all、properties

4. 巢狀(nested)

巢狀型別是一個特殊物件型別,巢狀型別允許對物件陣列的每一個元素(物件)相互獨立的進行查詢,也即他們不會被合併為一個物件。

巢狀型別的文件可以:

用 nested 查詢來查詢
用 nested來分析以及 reverse_nested 來聚合
用 nested sorting 來排序
用 nested inner hits 來檢索或高亮
例如:

PUT my_index/my_type/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": [
    { 
      "first": "John",
      "last":  "Smith"
    },
    { 
      "first": "Bob",
      "last":  "Leo"
    }
    ]
  }
}

// 轉換為:
{
  "region":             "US",
  "manager.age":        30,
  {
      "manager.name.first": "John",
      "manager.name.last": "Smith"
  },
  {
      "manager.name.first": "Bob",
      "manager.name.last": "Leo" 
  }
}

// 如果我們搜尋:
"bool": {
      "must": [
        { "match": { "manager.name.first": "John" }},   // John Smith
        { "match": { "manager.name.last": "Leo"}}       // Bob Leo
      ]
}

// 這樣的查詢將不能命中文件!!!

引數:
dynamic、include_in_all、properties

三 特殊型別

欄位型別定義關鍵字
IPIPV4 資料型別其實質是個 long 型別
Rangeinteger_range,float_range , long_range , double_range , date_range
token_count
geo point

IP型別

IPV4 資料型別其實質是個 long 型別,不過其能接收一個 IPV4 地址並且將他轉換為 long 型別存放。
引數:
boost、doc_values、include_in_all、index、null_value、precision_step、store

range型別

range型別的使用場景:比如前端的時間選擇表單、年齡範圍選擇表單等。

型別範圍
integer_range-2 ^31 ~ 2^31-1
float_range32-bit IEEE 754
long_range-2 ^63 ~ 2^63-1
double_range64-bit IEEE 754
date_range64位整數,毫秒計時
PUT range_index
{
	"mappings": {
		"my_type": {
			"properties": {
				 "expected_attendees": {
				  	 "type": "integer_range"
				 },
				 "time_frame": {
				   	 "type": "date_range", 
				  	 "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
				 }
			}
		}
	}
}
//
PUT range_index/my_type/1
{
  "expected_attendees" : { 
    "gte" : 10,
    "lte" : 20
  },
  "time_frame" : { 
    "gte" : "2015-10-31 12:00:00", 
    "lte" : "2015-11-01"
  }
}

token_count型別

token_count用於統計詞頻:

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "name": { 
          "type": "text",
          "fields": {
            "length": { 
              "type":     "token_count",
              "analyzer": "standard"
            }
          }
        }
      }
    }
  }
}

PUT my_index/my_type/1
{ "name": "John Smith" }

PUT my_index/my_type/2
{ "name": "Rachel Alice Williams" }

GET my_index/_search
{
  "query": {
    "term": {
      "name.length": 3 
    }
  }
}

geo point 型別

地理位置資訊型別用於儲存地理位置資訊的經緯度:

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}

PUT my_index/my_type/1
{
  "text": "Geo-point as an object",
  "location": { 
    "lat": 41.12,
    "lon": -71.34
  }
}

PUT my_index/my_type/2
{
  "text": "Geo-point as a string",
  "location": "41.12,-71.34" 
}

PUT my_index/my_type/3
{
  "text": "Geo-point as a geohash",
  "location": "drm3btev3e86" 
}

PUT my_index/my_type/4
{
  "text": "Geo-point as an array",
  "location": [ -71.34, 41.12 ] 
}

GET my_index/_search
{
  "query": {
    "geo_bounding_box": { 
      "location": {
        "top_left": {
          "lat": 42,
          "lon": -72
        },
        "bottom_right": {
          "lat": 40,
          "lon": -74
        }
      }
    }
  }
}

參考

  • https://blog.csdn.net/ZYC88888/article/details/83027458
  • https://blog.csdn.net/napoay/article/details/73100110#21-all

相關文章