Elasticsearch Mapping型別對映概述與元欄位型別
Mapping,對映,相當於關係型資料庫建立語句,定義文件欄位及其型別、索引與儲存方式。通常會涉及如下方面:
- 文件中哪些欄位需要定義成全文索引欄位。
- 文件中哪些欄位定義為精確值,例如日期,數字、地理位置等。
- 文件中哪些欄位需要被索引(能通過該欄位的值查詢文件)。
- 日期值的格式。
- 動態新增欄位的規則定義等。
1、型別對映概述
1.1 對映型別
Elasticsearch支援meta-fields、fields or properties兩種對映型別,將決定文件的索引方式。
-
Meta-fields
元資料欄位用於定義文件的元資料欄位的特徵,文件的元資料欄位主要包括_index、_type、_id、_source這4個欄位。 -
Fields or properties
屬性欄位列表,通過properties欄位定義整個文件有效載荷的各欄位的資料型別、分詞器等屬性。
對映型別,可以理解為以何種方式來定義索引中一個型別的欄位集。
1.2 資料型別
每一個欄位都會指定一個數據型別,資料型別通常如下:
簡單型別,例如text、keyword、date、long、double、boolean、ip
複合型別,諸如object(json)、netsed.
特殊型別,諸如geo_point、geo_shape(地圖相關型別)、completion。
後續章節會單獨重點剖析elasticsearch所支援的資料型別。
1.3 對映保護機制
es提供如下引數來限制es的行為:
- index.mapping.total_fields.limit t
索引中允許定義的最大欄位(屬性)個數,預設為1000。 - index.mapping.depth.limit
欄位級聯的最大深度,預設為20。 - index.mapping.nested_fields.limit
一個索引最多包含欄位型別為nested的個數,預設為50。
1.4 動態對映機制
與關係型資料庫不同的是,一個type(對應關係型資料庫的表)中的欄位可以在使用過程中動態新增。具體的動態對映機制,將在後續文章中單獨結束。
1.5 更新已有對映定義
es不支援直接修改已索引的已存在的欄位對映,因為修改欄位對映,意味著已索引的資料生效,可以使用別名機制來修改欄位的名稱,如果需要修改已存在欄位的對映,建議重新建立一個索引,再使用reindex API遷移資料。
1.6 索引、type組織方式
索引在建立時,Elasticsearch6.x版本只支援一個對映型別,而7.x版本後將完成刪除對映型別。es5.x中一個索引包含多個type的情況再6.x版本將繼續支援查詢,7.0版本後,API將完成移除與多型別相關的API。
Elasticsearch6.x版本後為什麼不繼續對單一索引庫提供多型別支援呢?
當初,為了方便理解es,通常與關係型資料庫進行類比,例如es中的index(索引)相當於關係型資料庫的database,而型別(type)相當於關係型資料庫中的table。其實這是一個錯誤的比喻。在關係型資料庫中,表是相互獨立的,一個表中的列名與另外一個表中的列名相同是沒有關係的,但對於es的型別對映定義,情況並非如此。
在es單一索引中,不同對映型別(type)具有相同名稱的欄位在內部都是由同一個Lucence欄位來儲存,這也就意味著同一個索引內不同的型別,如果出現名字相同的欄位,其資料型別也必須相同。更重要的是,儲存在同一索引中具有很少或沒有共同欄位的不同型別(實體)會導致資料稀疏,大大降低Lucece高效壓縮文件的能力,影響其檢索效能。
基於上述各種原因,故es將在後續版本中不支援一個索引中定義多個型別。
2、meta-field(元欄位)
每個文件都有與之關聯的元資料,例如_index、mapping _type和_id元欄位。在建立對映型別時,可以定製其中一些元欄位的行為。
- identity meta-fields(表明文件身份的元欄位)
- _index
文件所在的索引,類似於關係型資料庫的database。 - _uid
_type與_id的組合,文件的唯一標識。 - _type
文件對映型別。 - _id
文件的_id值。
- document source meta-fields
- _source
文件的原始json資料。 - _size
文件_souce欄位的位元組長度,需要外掛:mapper-size plugin。
- indexing meta-fields
- _all
將所有欄位對映成一個_all欄位,在6.0.0版本後廢棄,可以使用copy_to來定義需要聚合的欄位。
_field_names
_field_names欄位,用於索引文件中包含除null之外的任何值的每個欄位的名稱。exist查詢使用這個欄位來查詢對於特定欄位具有或不具有任何非空值的文件,也就是該欄位記錄的是欄位值不為null的所有欄位名稱。當前版本,_field_names欄位不包含啟用了doc_values、norm的欄位,對於啟用doc_values或norm的欄位,exist查詢仍然可用,但不會使用_field_names欄位。
注:禁用_field_names通常是不必要的,因為它不再承載以前的索引開銷。如果你有很多禁用doc_value和norm的欄位,並且你不需要使用這些欄位執行exist查詢,你可能想禁用_field_names,你可以通過如下方式禁用_field_names欄位:
PUT tweets
{
"mappings": {
"_doc": {
"_field_names": {
"enabled": false
}
}
}
}
- _ignored
設定為ignore_malformed=true的所有欄位。
- routing meta-field
- _routing
分片路由欄位。
- other meta-field
1._meta
用於使用者自定義的元資料,例如:
PUT my_index
{
"mappings": {
"_doc": {
"_meta": {
"class": "MyApp::User",
"version": {
"min": "1.0",
"max": "1.3"
}
}
}
}
}
本文初步介紹了Elasticsearch 型別對映與元欄位型別,後續文章將介紹對映引數、elasticsearch支援的資料型別、自動型別對映機制等。
更多文章請關注微信公眾號:
相關推薦
Elasticsearch Mapping型別對映概述與元欄位型別
Mapping,對映,相當於關係型資料庫建立語句,定義文件欄位及其型別、索引與儲存方式。通常會涉及如下方面: 文件中哪些欄位需要定義成全文索引欄位。 文件中哪些欄位定義為精確值,例如日期,數字、地理位置等。 文件中哪些欄位需要被索引(能通過該欄位的值查詢文件)
ElasticSearch 6.x 學習筆記:12.欄位型別
12.1 欄位型別概述 一級分類 二級分類 具體型別 核心型別 字串型別 string,text,keyword 整數型別 integer,long,
ElasticSearch學習筆記六 對映元欄位( Mapping Meta-Fields)
Meta-Fields 每個文件都有與之關聯的元欄位,例如_index、_type和 _id 元欄位。 元欄位是mapping對映中用啦描述文件本身資訊的欄位。 Identity meta-fields(文件標示元欄位) _index 文件所屬的索引。 多索引
elasticsearch中的欄位型別/mapping引數
查看錶結構的定義 GET /testindex/_mapping GET /testindex/testtable/_mapping (一)核心資料型別: (1)string: 預設會被分詞 string型別包括:text 和 keyword 一個完整示例如下 :
解決在springboot+mybatis+postgresql時,資料庫欄位型別為json時,如何與mybatis進行對映
pg 資料庫中 某欄位型別為jsonJava實體中對應型別是 jsonObject private JSONObject info;在mybatis的xml中,常規無法直接進行對映,需要自己寫一個TypeHandler,自定義一個JSONTypeHandlerPg類具體程
Oracle與mysql的欄位型別整理
Oralce的欄位型別整理如下: Mysql的欄位型別整理如下: 最後面一欄是對應JAVA的基本型別。希望對初學者有用,初學者在學習JAVA的時候,不知道怎麼把JAVA的物件指向到ORALCE或者MYSQL的欄位中,通過這個表格 可以很清楚的瞭解到,物件對映成資
ES Mapping、欄位型別Field type詳解
欄位型別概述 一級分類 二級分類 具體型別 核心型別 字串型別 string,text,keyword 整數型別 integer,long,short,byte 浮點型別 double,float,half_float,scaled_float 邏輯型別 boolean 日期型
欄位型別與合理的選擇欄位型別
欄位型別 數值 MySQL 的數值資料型別可以大致劃分為兩個類別,一個是整數,另一個是浮點數或小數。許多不同的子型別對這些類別中的每一個都是可用的,每個子型別支援不同大小的資料,並且 MySQL 允許我們指定數值欄位中的值是否有正負之分(UNSIGNED)或者用零填補(ZEROFILL)。 INT
【規範建議】服務端介面返回欄位型別與iOS端的解析
一、本文件的寫作目的 App需要跟產品、UI、後臺、伺服器、測試打交道,app的產出是其他端人員產出的綜合體現。與其他端人員溝通就像是開發寫介面,也就是面向介面程式設計的思想。 本文件講解針對的是服務端返回資料時使用的欄位資料型別如何選擇、iOS端將JSON資料轉模型的時候用什麼型別來定義對應的屬
Elasticsearch入門必備——ES中的欄位型別以及常用屬性
使用Elasticsearch時,瞭解欄位的概念,是必不可少的。畢竟無論是es還是傳統的資料庫,都無法弱化欄位的型別。 背景知識 在Es中,欄位的型別很關鍵: 在索引的時候,如果欄位第一次出現,會自動識別某個型別,這種規則之前已經講過了。 那麼如果一個欄位已經存在了,並且設定為某個型別。再來一條資料,欄
Java併發22:Atomic系列-原子型別整體概述與類別劃分
從本章開始學習原子變數:Atomic,包路徑為:java.util.concurrent.atomic。 本章主要對java.util.concurrent.atomic開發包下的類進行整體概
mysql——時間欄位型別與C#中datetime
一、引言 做專案的時候開始糾結於用2013-01-01 12-12-12儲存還是用 2013-01-01儲存,這個設計到的問題是mysql中時間欄位的選擇問題:date、time或者datetime
mysql欄位每個型別長度大小與建表的型別長度
在建立資料庫表時,例如 create table user ( id int(4) primary key , name varchar(20), pwd varchar(20) ); 括號裡的數字叫資料的寬度,我們不能一概而論,因為不同的資料型別對寬度的處理也不一樣: 1、整數型別,這裡顯示的寬度
SQL查詢表字段名稱與欄位型別、長度
select o.name as 表名, c.name as 欄位名稱, t.name as 欄位型別, c.length as 欄位長度 from syscolumns c inner join sysobjects o on c.id = o.id and o.xtype = 'u' inner joi
laravel-mongodb查詢條件與欄位型別不一致問題
因為PHP是弱型別語言,最常見的不一致的情況應該是整型與字串。 例如,當mongodb表的主鍵為NumberLong型別,如下的程式碼查詢不到結果 $id = '4476850'; $row = M
jpa欄位型別對映說明
[url]http://blog.csdn.net/ljhabc1982/article/details/6556349[/url]JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關係對映工具來管理J
(Shadow Mapping) 陰影對映原理與實現
安卓demo 下載 轉載請宣告出處:http://blog.csdn.net/xiaoge132/article/details/51458489 陰影貼圖(Shadow mapping) 是在
Elasticsearch如何實現篩選功能(設定欄位不分詞和聚合操作)
0 起因 中文分詞中比較常用的分詞器是es-ik,建立索引的方式如下: 這裡我們為index personList新建了兩個欄位:name和district,注意索引名稱必須是小寫 (以下格式都是在kibana上做的) PUT /person_list { "mappings
oracle的欄位型別限制
CHAR ORACLE限制 2000 VARCHAR2 ORACLE限制 4000 LONG 32,767位元組 CLOB
sqlserver 獲取所有表的欄位型別等資訊
USE [MultipleAnalysisDataFY] GO /****** Object: View [dbo].[selectfieldtype] Script Date: 2018/11/7 星期三 12:02:27 ******/ SET ANSI_NULLS ON GO SET