1. 程式人生 > >elasticsearch的keyword與text的區別(5.4)

elasticsearch的keyword與text的區別(5.4)

es2.*使用者可忽略該文章。作者不會使用2.*版本的es!!!

當初接觸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欄位不會進行分詞。

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

 

例如,下面配置了一個keyword 和 text