es2.*用戶可忽略該文章。es 2.*版本里面是沒有這兩個字段!!!
當初接觸es,最驚訝就是他的版本速度發布太快,這次主要討論keyword與text的區別
在es 2.*版本里面是沒有這兩個字段,只有string字段。
5.*之后,把string字段設置為了過時字段,引入text,keyword字段
這兩個字段都可以存儲字符串使用,但建立索引和搜索的時候是不太一樣的
keyword:存儲數據時候,不會分詞建立索引
text:存儲數據時候,會自動分詞,並生成索引(這是很智能的,但在有些字段里面是沒用的,所以對於有些字段使用text則浪費了空間)。
"zuMaker":
{"type":"keyword","index":"false"}, "zuName": {"type":"text","index":"true","boost":"5","analyzer":"ik_max_word","search_analyzer":"ik_max_word"},
現在我建立兩個字段:
zuMaker 族制作人 keyword類型
zuName 族名稱 text類型
我現在分別往兩個字段里面存儲數據,zuMaker存儲 “張三李四”zuName存儲 “牆體鋼結構”、
其實在存儲的過程中zuMaker 沒有分詞,只是存儲了一個張三李四,而zuName字段存儲倒排索引的時候進行了分詞 牆體 和 鋼結構或者是牆體 鋼 結構。
這樣在查詢的時候,這兩個字段的區別就表現出來了
如果精確查找zuName字段
{ "query": { "term": { "zuName": "牆體鋼結構" } } }
會出現空數據,表示查不到數據,這是因為牆體鋼結構這個值在存儲的時候被分詞了,倒排索引里面只有‘牆體’,'鋼結構',這兩個詞所以會出現查找為空的記錄
這種情況下的分詞是存儲數據時候的分詞,還有一種分詞是在你搜索的時候根據你的搜索參數進行分詞后再進行搜索的。es提供了許多開箱即用的分析器analyzer,大家也可以去下載被人開發好的分詞器然后安裝在es的plugins下,然后在聲明使用。在zuName這個字段我用的是ik的分詞器,是一個大家基本都會用到的中文分詞器,git地址為 https://github.com/medcl/elasticsearch-analysis-ik。
如果精確查找zuMakert字段
{ "query": { "term": { "zuMakert": "張三李四" } } }
這時候這條記錄是存在的,因為keyword字段不會進行分詞。
這查詢是精確查詢出現的結果,如果你使用分詞查詢,結果就會一樣,但搜索結構的權重是不一樣的。具體區別大家自己上級實驗。