默認mapping
ES能非常聰明的識別出"name"和"description"字段的類型是string, ES默認會創建以下的mapping。
mappings: {
item: {
properties: {
description: {
type: string
}
name: {
type: string
}
}
}
}
mapping參數
字段中的type(es數據類型)
1.text 字符串,分詞,全文索引
2.keyword 關鍵字,不分詞,適合id,email等這種不分詞的字段
3.numeric 數字類型有integer、long、short、byte、double、float等類型
4.date 時間類型
5.boolean 布爾類型
6.binary 接收base64編碼的字符串
7.rang 具體有integer_range,float_range,long_range,double_range,date_range,ip_range,可存儲范圍數據,如下插入
什么是mapping
ES的mapping非常類似於靜態語言中的數據類型:聲明一個變量為int類型的變量, 以后這個變量都只能存儲int類型的數據。同樣的, 一個number類型的mapping字段只能存儲number類型的數據。
同語言的數據類型相比,mapping還有一些其他的含義,mapping不僅告訴ES一個field中是什么類型的值, 它還告訴ES如何索引數據以及數據是否能被搜索到。
當你的查詢沒有返回相應的數據, 你的mapping很有可能有問題。當你拿不准的時候, 直接檢查你的mapping。
剖析mapping
一個mapping由一個或多個analyzer組成, 一個analyzer又由一個或多個filter組成的。當ES索引文檔的時候,它把字段中的內容傳遞給相應的analyzer,analyzer再傳遞給各自的filters。
filter的功能很容易理解:一個filter就是一個轉換數據的方法, 輸入一個字符串,這個方法返回另一個字符串,比如一個將字符串轉為小寫的方法就是一個filter很好的例子。
一個analyzer由一組順序排列的filter組成,執行分析的過程就是按順序一個filter一個filter依次調用, ES存儲和索引最后得到的結果。
總結來說, mapping的作用就是執行一系列的指令將輸入的數據轉成可搜索的索引項。
對於 String 字段,可以設置類型為 text 或者 keyword。text類型的數據會被分詞處理,而 keyword 類型的數據不會被分詞處理。因此想根據某個字段精確查詢的話,可以將其設置為 keyword 類型(版本5.0之后)。
如果一個索引庫已經存在索引文檔,這時想要更改索引的mapping的話,最好刪除當前索引庫,重新建立索引庫,設置 mapping 之后,將數據重新添加到索引庫中。
默認analyzer
回到我們的例子, ES猜測description字段是string類型,於是默認創建一個string類型的mapping,它使用默認的全局analyzer, 默認的analyzer是標准analyzer, 這個標准analyzer有三個filter:token filter, lowercase filter和stop token filter。
我們可以在做查詢的時候鍵入_analyze關鍵字查看分析的過程