Es Mapping篇主要是講解Mapping的一些相關配置與需要注意的地方,說到Mapping大家可能覺得有些不解,其實我大體上可以將Es 理解為一個數據管理平台,那么index 當然就是庫了,type可以理解為表,mapping可以理解為表的結構和相關設置的信息(當然mapping有更大范圍的意思)。Mapping的作用域也是從cluster、node、index、type。
curl -XPOST localhost:9200/wf_mds_org(索引名稱) -d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.refresh_interval": "-1",
"index.translog.flush_threshold_ops": "100000"
},
"mappings": {
"org": { //(類型)
"_all": {
"analyzer": "ike"
},
"_source": {
"compress": true
},
"properties": {
"_ID": {
"type": "string",
"include_in_all": true,
"analyzer": "keyword"
},
"NAME": {
"type": "multi_field",
"fields": {
"NAME": {
"type": "string",
"analyzer": "keyword"
},
"IKO": {
"type": "string",
"analyzer": "ike"
}
}
},
"SHORTNAME": {
"type": "string",
"index_analyzer": "pct_spliter",
"search_analyzer": "keyword",
"store": "no"
},
"OLDNAME": {
"type": "multi_field",
"fields": {
"OLDNAME": {
"type": "string",
"analyzer": "keyword"
},
"IKO": {
"type": "string",
"analyzer": "ike"
}
}
},
"TNAME": {
"type": "string",
"analyzer":"custom_snowball_analyzer",
"store": "no"
},
"TSNAME": {
"type": "string",
"index": "no",
"store": "no"
},
"TONAME": {
"type": "string",
"index": "no",
"store": "no"
}
}
}
}
}'
上面給出了一個完整Mapping,我們可將Mapping信息大致分成settings和mappings兩個部分,settings主要是作用於index的一些相關配置信息,如分片數、副本數等(分片和副本在es簡介中講過,更加詳細的東西會在索引優化篇中講)、tranlog同步條件、refresh條條等。Mappings部分主是要結果構的一些說明,mappings 我們可以看到主體上大致又分成_all、_source、properites這三個部分。
1、_all:主要指的是All Field字段,我們可以將一個或都多個包含進不,在進行檢索時無需指定字段的情況下檢索多個字段。前提是你得開啟All Field字段
"_all" : {"enabled" : true}
2、_source:主要指的是Source Field字段Source可以理解為Es除了將數據保存在索引文件中,另外還有一分源數據。_source字段我在們進行檢索時相當重要,如果在{"enabled" : false}情況下默認檢索只會返回ID,你需通過Fields字段去倒索索引中去取數據,當然效率不是很高。如果覺得enabale:true時,索引的膨漲率比較大的情況下可以通過下面一些輔助設置進行優化:
Compress:是否進行壓縮,建議一般情況下將其設為true
"includes" : ["author", "name"],
"excludes" : ["sex"]
上面的includes和 excludes主要是針對默認情況下面_source一般是保存全部Bulk過去的數據,我們可以通過include,excludes在字段級別上做出一些限索。
3、properites部分是最重要的部分主要是針對索引結構和字段級別上面的一些設置
"NAME": { //字段項名稱對應lucene里面FiledName
"type": "string",//type為字段項類型
"analyzer": "keyword"//字段項分詞的設置對應Lucene里面的Analyzer
},
在Es中字段項的 type是一個很重要的概念,在Es中在Lucene的基礎上提供了比較多的類型,而這些類型對應這一些相關的檢索特性如 Date型 我可以使用 [2001 TO 2012]的方式進行范圍檢索等,Es 的類型有如下一些:
簡單類型:
String:字符型最常用的
Integer:整型
Long:長整型
Float:浮點型
Double:雙字節型
Boolean:布爾型
復雜類型:
Array:數組型
“lists”:{{“name”:”…”},{“name”:”…”}}
Object:對象類型
“author”:{“type”:”object”,”perperites”:{“name”:{“type”:”string”}}}
說到Array和Object有一個性能上的問題,Es中提供了Facet檢索,據Es的作者提供的消息,在做Facet時object類型相比與array的內存要占用的少,但我本人經過測試效果不是很明顯有興趣的可以測試一下。
Multi_field:多分詞字段,針對一個字段提供多種分詞方式
Nested: 嵌入類型用的還是比較多的
類型常用的也就這些了,還有一些類型大家可以參考官網,另外一個比較重的方面的就是分詞了(analyzer),不管在目前任何檢索系統是分詞決定這檢索的查全與查准及索引的膨漲率等。在Es中analyzer的作用域也是從cluster、index、filed這三個作用域。Cluster的配置在配置中講過,下面以Field為主(另外具體的分詞一些相關東西會在分詞篇中講)
Analyzer,在Lucene中是一個分詞器的概念,我們知道Es是建立在Lucene之上的,所以這里的Analzyer同樣的也適用,Mapping 中的Analyzer主在是指定字段采用什么分詞器,具體的程序和配置分詞在插件和配置都有過一些說明。
Analyzer在Es中分為index_analyzer和search_analyzer
Index_analzyer:指的是索引過程中采用的分詞器
Search_analyzer:指的是檢索過程中采用的分詞器
我們知道index和search是兩個過程,但是盡量保證這兩個過程和分詞方式一致這樣可以保證查全和查准,否則再牛B的分詞,index和search采用的不相同也是無用功。
與analyzer與之相關的就是別外一項index項
"HC":{ "type":"string", "index":"no", "store":"no"}
Index表示該字段是否索引,如果index為no那個analyzer設為啥也沒用。
最后是”store”項了store項表示該項是否存儲到倒索索引中去,並不是_source,當項mapping中還有很多可以設置和優化的地方,會面在慢慢討論。在mapping中index和store如果大家有時候覺得有點和source搞不清楚,大家可以參考lucene中的Field.Store.YES,Field.Index.NOT_ANALYZED,Field.Index等相關設置就比較明白了。
