天天看點

ElasticSearch text和keyword資料類型的差別

正經學徒,佛系記錄,不搞事情

2.*的版本,字元串類型為string

5.*之後的版本,字元串類型區分為keyword和text,設定string字段會提示為過時類型

最大的差別在于:

  • keyword:存儲資料時不會分詞建立索引,常用于對文檔進行過濾、排序、聚合的操作
  • text:存儲資料會自動分詞,并生成索引,用于全文索引的字段

由此兩種類型的對應使用場景就不同了,這裡建立一個person索引,新增兩個字段str_keyword,str_text,類型分别對應keyword和text

ElasticSearch text和keyword資料類型的差別

添加一條記錄

ElasticSearch text和keyword資料類型的差別

判斷兩個字段的分詞情況

ElasticSearch text和keyword資料類型的差別
ElasticSearch text和keyword資料類型的差別

可見keyword未被分詞,而text被分詞成just、test

是以進行term查詢時,str_keyword将查詢不到記錄,因為被分詞成just、test

ElasticSearch text和keyword資料類型的差別

另一個方面,進行聚合查詢時,keyword可以直接執行,且效率更高,而text聚合時需要特定的給字段啟用Fielddata,而啟用Fielddata将會導緻消耗大量堆空間,更多關于 Fielddata 可點選檢視。

添加資料進行聚合測試:

ElasticSearch text和keyword資料類型的差別

keyword類型可直接聚合

ElasticSearch text和keyword資料類型的差別

text類型無法直接聚合

ElasticSearch text和keyword資料類型的差別

提示“Fielddata is disabled on text fields by defaul”,“Fielddata預設禁用”,需要手動設定啟用

ElasticSearch text和keyword資料類型的差別

再次進行查詢時查詢成功

ElasticSearch text和keyword資料類型的差別

注:雖然能夠通過設定fielddata讓text類型也支援聚合、排序等操作,但是盡量避免使用該方式。

推薦做法:

  1. 将需要排序、聚合的字段類型設定為keyword類型。
  2. 如果該字段一定需要text類型來作全文檢索,則添加一個類型為keyword的新字段與之對應,單獨用于作聚合、排序操作

繼續閱讀