在Elasticsearch建立mapping的時候,須要制定store屬性和index屬性,對於剛入門es的學者,一般對lucene又不熟悉的人,一般不知道如何設置這兩個值。app
先來看需求:性能
在作搜索時,常常會須要對一個分類進行分 組,好比搜索"ipad",須要在平板電腦分類下面統計有多少個商品,在電腦配件下面統計有多少個商品,這種統計數量的需求,咱們一般會在 document裏面添加一個分類ID,而後對全部的分類作facet。那麼問題出來了,若是分類ID是個整數的話,store屬性應該設置true or false?這種整數是否還須要索引?學習
這個問題,在ES的文檔中怎麼也找不到,我的一開始又對lucene不熟悉,因此花時間看了一下lucene。經過學習lucene及實際的實踐得出,以上需求的設置store應該爲no,而index應該設置爲not_analyzied。測試
下面咱們來仔細理解一下這兩個設置項。spa
其中index的含義還比較容易理解,一 共3個值,no,analyzied,not_analyzied,分別對應'不對該字段進行索引(沒法搜索)','分詞後索引','以單個關鍵詞進行索 引'。就是說,若是這個字段不須要搜索,通常不須要設置爲analyzied,可是若是不搜索,針對以上的需求,index應該設置爲no嗎?請繼續往下 看。code
一般分類在索引的時候都是一個整數或長整數,對應lucene的IntField或LongField,而這兩個類在lucene中的第一行註釋是:Field that indexes int
values for efficient range filtering and sorting.(Field that indexes long
values for efficient range filtering and sorting),也就是說,IntField是被索引的,而且這種索引在範圍過濾和排序的時候性能很是高。那麼問題就很明確了,由於,咱們的分類字段也是做爲filter項的,所以若是要作過濾,必須進行索引。不然可能沒法做爲過濾條件。blog
實際上,咱們在建立mapping的時 候,若是設置了數據類型爲integer,其餘的都未指定,默認的index即爲no_analyzied。至於store,採用默認值也是合適的(默認 爲no),實際上這些默認值都是lucene的默認值。由於通常咱們是用不到store='yes'的功能的,除非,咱們須要對某個域(就是字段)進行高 亮顯示。排序
你可能會問,若是設置store:"no",會不會影響facet的性能。答案爲不會,由於作facet的時候並不會使用store的字段,而是使用的索引表的詞。也就是後面設置的index:'not_analyzied"。索引
我本身作過一個測試,若是設置分類ID不索引,則沒法進行facet,可見任何須要facet的字段,必須進行索引。 ip