ES Mapping ,1 欄位型別
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
三 特殊型別
欄位型別 | 定義關鍵字 |
---|---|
IP | IPV4 資料型別其實質是個 long 型別 |
Range | integer_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_range | 32-bit IEEE 754 |
long_range | -2 ^63 ~ 2^63-1 |
double_range | 64-bit IEEE 754 |
date_range | 64位整數,毫秒計時 |
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
相關文章
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- MongoDB更改欄位型別MongoDB型別
- oracle的欄位型別Oracle型別
- sql語句修改欄位型別和增加欄位SQL型別
- MySQL欄位型別最全解析MySql型別
- date、timestamp欄位型別型別
- MySQL欄位型別小記MySql型別
- 資料欄位型別匹配型別
- 修改表的欄位型別型別
- sqlite sql 修改欄位型別SQLite型別
- ES 筆記十三:多欄位特性及 Mapping 中配置自定義 Analyzer筆記APP
- 【mongo】mongo 欄位型別互轉Go型別
- [轉]MySQL 欄位型別參考MySql型別
- MongoDB中的欄位型別IdMongoDB型別
- oracle 修改欄位型別的方法Oracle型別
- 欄位型別檢測指令碼型別指令碼
- 比較所有的欄位型別型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- 物件型介面 / 定製操作型別和欄位物件型別
- Oracle 修改欄位型別和長度Oracle型別
- mysql表操作(alter)/mysql欄位型別MySql型別
- 修改欄位資料型別的方法資料型別
- LONG欄位型別向CLOB遷移型別
- 細說SQL SERVER中欄位型別SQLServer型別
- 主流資料庫欄位型別轉.Net型別的方法資料庫型別
- Elasticsearch Mapping型別修改ElasticsearchAPP型別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- Sqlserver修改線上表的表欄位型別SQLServer型別
- 改變表中非空欄位的型別型別
- sqlserver查詢一個庫所有表的欄位名及欄位型別SQLServer型別
- varchar or blob:欄位型別的儲存和溢位條件型別
- JSON欄位型別在ORM中的使用JSON型別ORM
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- 含LONG型別欄位的表無法MOVE型別
- MSSQL資料庫的欄位型別總結SQL資料庫型別
- 多型關聯自定義的型別欄位的處理多型型別
- 欄位管理,為什麼只有新增的時候才自動匹配欄位型別型別