elasticsearch 數據類型text和keyword區別

在es 2.*版本里面是沒有這兩個字段,只有string字段。

5.*之後,把string字段設置爲了過時字段,引入text,keyword字段

這兩個字段都可以存儲字符串使用,但建立索引和搜索的時候是不太一樣的

keyword:存儲數據時候,不會分詞建立索引

text:存儲數據時候,會自動分詞,並生成索引(這是很智能的,但在有些字段裏面是沒用的,所以對於有些字段使用text則浪費了空間)。

所以大家在創建文檔的時候一定要設計好數據類型,因爲es不可以修改字段類型或者刪除字段

具體區別如下:
“zuMaker”:
{“type”:“keyword”},
“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": { "zuMaker": "張三李四" } } }

這時候這條記錄是存在的,因爲keyword字段不會進行分詞。

這查詢是精確查詢出現的結果,如果你使用分詞查詢,結果就會一樣,但搜索結構的權重是不一樣的。具體區別大家自己實驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章