下面是multi-field的介紹:
multi_field 多域類型允許你對同一個值以映射的方式定義成多個基本類型 core_types . 這個非常有用,比如,如果你定義一個 string 類型的字段,你需要這個字段的分詞一會是 analyzed ,但是有時候又希望該字段是 not_analyzed 類型的,通過使用 multi_field 就可以很方便的解決這個問題. 下面來看個例子:
{
"tweet" : {
"properties" : {
"name" : {
"type" : "multi_field",
"fields" : {
"name" : {"type" : "string", "index" : "analyzed"},
"untouched" : {"type" : "string", "index" : "not_analyzed"}
}
}
}
}
}
上面的例子,顯示了我們是如何定義一個名為 name 的字段, 它的數據類型是 string 字符類型, 該字段映射了兩次(實際物理上產生了2個索引字段),其中一個是以 name 的名稱 定義為 analyzed 分詞類型,另外一個定義成了名稱為 untouched 的 not_analyzed 類型,即不分詞處理.
字段訪問
當使用 multi_field mapping定義之后, fields里面的和字段名稱和外部的字段名稱相同的字段定義會被當做該mult-field的默認字段(因為一個multi類型字段會被拆分成多個字段,所以,會有一個默認值),我們可以通過直接名稱 name 或者使用 tweet.name 格式的方式來指定字段.
其它定義的不同名稱的字段也可以通過使用特點的導航來指定(即使用“.”符合來分割),如: name.untouched, 或者還帶上類型名稱 tweet.name.untouched.
合並Merging
當使用更新mapping接口 put_mapping 的時候,一個基本類型(core type) mapping定義能夠自動升級成 multi_field mapping定義. 這意味着舊的定義是普通的基本類型的mapping,通過保持默認字段一致(即定義的multi-field的默認字段定義保持為舊的mapping的定義),就能夠升級為 multi_field 類型.
開始介紹下更具體的用法,一步一步的啊。
mapping的使用和分詞的配置之前也介紹過,再重頭來一遍吧。
這么個場景,之前在pinyin插件里面寫的,拿過來:https://github.com/medcl/elasticsearch-analysis-pinyin
我們現在需要實現人名的搜索,可以除了通過中文,還可以通過拼音來進行搜索,怎么做呢?
“執行索引前,轉換中文姓名,得到拼音,然后分別建兩個字段,往里面寫數據,不就可以了嗎?”
土了吧,看我給你介紹新的玩法。
用multi-field和pinyin插件。
前提准備:插件安裝什么的我就不說了,可以使用RTF,相關都配置做好了,直接可以用。
1.自定義分詞,開始之前,需要先定義好分詞,可以在配置文件里面定義,但是不靈活,定義完了之后,需要重啟es,還一種方式就是動態的添加自定義分詞,如下所示:
curl -XPOST http://localhost:9200/medcl/_close
curl -XPUT http://localhost:9200/medcl/_settings -d'
{
"index" : {
"analysis" : {
"analyzer" : {
"pinyin_analyzer" : {
"tokenizer" : ["my_pinyin"],
"filter" : ["standard","nGram"]
}
},
"tokenizer" : {
"my_pinyin" : {
"type" : "pinyin",
"first_letter" : "prefix",
"padding_char" : ""
}
}
}
}
}'
curl -XPOST http://localhost:9200/medcl/_open
上面自定義了一個名為my_pinyin的tokenizer,和名為pinyin_analyzer的analyzer,值得注意的是,修改索引的setting,需要先close索引,修改完之后,open就好了。
2.創建好索引,設置好analyzer,我們再來定義Type的,Type名稱就用folks吧,有一個name字段,用來存姓名就好了。
curl -XPOST http://localhost:9200/medcl/folks/_mapping -d'
{
"folks": {
"properties": {
"name": {
"type": "multi_field",
"fields": {
"name": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "pinyin_analyzer",
"boost": 10
},
"primitive": {
"type": "string",
"store": "yes",
"analyzer": "keyword"
}
}
}
}
}
}'
上面定義了一個folks的Type,有一個字段名稱為name,該字段數據類型為string,對象類型為multi-field,正因為類型是multi-field,它有了一些額外的參數可以進行設置,即fields,fields里面設置衍生字段的屬性,可以是多個,每個都可以分別設置analyzer,store等參數,和core類型無異,如上,定義了一個name,使用的是pinyin analyzer和一個primitive,使用的是keyword analyzer,當想通過拼音搜索的時候,就對第一個字段name進行搜索就行了,如果需要完整匹配中文姓名,則對primitive字段進行搜索就行了。
