Elasticsearch 與傳統的 SQL數據庫的一個明顯的不一樣點是,Elasticsearch 是一個 非結構化 的數據庫,或者說是一個 無模式 的數據庫。Elasticsearch 中數據最重要的三要素當屬:索引、類型、文檔,其中索引這個概念很是重要,咱們能夠粗略地將其類比到傳統SQL數據庫中的 數據表。本文就從 Elasticsearch 的索引映射如何配置開始講起。數據庫
注: 本文首發於 My Personal Blog,歡迎光臨 小站 !json
本文內容腦圖以下:文章共1540字,閱讀本文大約須要5分鐘 !app
建立索引時,能夠自定義索引的結構,好比 建立一個保存用戶信息數據的 users
索引,其典型的結構以下:curl
id
:惟一表示符name
:姓名birthday
:出生日期hobby
:愛好爲此咱們能夠建立一個 json 格式的索引模式映射文件:users.json工具
{ "mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } } }
上面的 json代碼意義以下:post
users
的 Indexuser
的 Typeuser
有四個 field而後咱們來執行以下命令來新建一個索引:性能
curl -X PUT http://47.98.43.236:9200/users -d @users.json
結果以下,索引 users
、類型 user
、以及 四個字段 都已經順利插入:學習
關於字段的 可選類型,有以下幾種:測試
string
:字符串number
:數字date
:日期boolean
:布爾型binary
:二進制ip
:IP地址token_count
類型關於每種類型有哪些 屬性,可參考官方文檔,因爲內容太多,此處再也不贅述。編碼
分析器是一種用於 分析數據 或者按照用戶想要的方式 處理數據 的工具,對於 字符串類型 的字段,Elasticsearch 容許用戶自定義分析器。
{ "settings" : { "index" : { "analysis" : { "analyzer" : { "myanalyzer" : { "tokenizer" : "standard", "filter" : [ "asciifolding", "lowercase", "myFilter" ] } }, "filter" : { "myFilter" : { "type" : "kstem" } } } } }, "mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } } }
上述 json代碼中,用戶定義了一個名爲 myanalyzer 的分析器,該分析器包含 一個分詞器 + 三個過濾器,分別以下:
standard
asciifolding
lowercase
myFilter
(自定義過濾器,其本質是 kstem
)能夠經過相似以下的 Restful接口來測試 analyze API 的工做狀況:
curl -X GET 'http://47.98.43.236:9200/users/_analyze?field=user.name' -d 'Cars Trains'
可見咱們輸入的時一行字符串普通"Cars Trains"
,而輸出爲:car
和 train
,這說明短語 "Cars Trains"
被分紅了兩個詞條,而後所有轉爲小寫,最後作了詞幹提取的操做,由此證實咱們上面自定義的分析器已然生效了!
Elasticsearch 容許爲索引模式映射文件中的不一樣字段指定不一樣的 類似度得分 計算模型,其用法例析以下:
"mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer", "similarity" : "BM25" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } }
上述 json文件中,咱們爲
name
字段使用了BM25
這種類似度模型,添加的方法是使用similarity
屬性的鍵值對,這樣一來 Elasticsearch 將會爲name
字段使用BM25
類似度計算模型來計算類似得分。
Elasticsearch 支持爲每一個字段指定信息格式,以知足經過改變字段被索引的方式來提升性能的條件。Elasticsearch 中的信息格式有以下幾個:
default
:默認信息格式,其提供了實時的對存儲字段和詞向量的壓縮pulsing
:將 重複值較少字段 的信息列表 編碼爲詞條矩陣,可加快 該字段的查詢速度direct
:該格式在讀過程當中將詞條加載到未經壓縮而存在內存的矩陣中,該格式能夠提高經常使用字段的性能,但損耗內存memory
:該格式將全部的數據寫到磁盤,而後須要FST來讀取詞條和信息列表到內存中bloom_default
:默認信息格式的擴展,增長了把 bloom filter
寫入磁盤的功能。讀取時 bloom filter
被讀取並存入內存,以便快速檢查給定的值是否存在bloom_pulsing
:pulsing
格式的擴展,也加入 bloom filter
的支持信息格式字段(postings_format
)能夠在 任何一個字段上 進行設置,配置信息格式的示例以下:
"mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes", "postings_format" : "pulsing" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" } } } }
在該例子之中,咱們手動配置改變了
id
字段的信息格式爲pulsing
,所以可加快該字段的查詢速度。
文檔值 這個字段屬性做用在於:其容許將給定字段的值被寫入一個更高內存效率的結構,以便進行更加高效的排序和搜索。咱們一般能夠將該屬性加在 須要進行排序 的字段上,這樣能夠 提效。
其配置方式是 經過屬性 doc_values_format
進行,有三種經常使用的 doc_values_format
屬性值,其含義從名字中也能猜個大概:
default
:默認格式,其使用少許的內存但性能也不錯disk
:將數據存入磁盤,幾乎無需內存memory
:將數據存入內存舉個栗子吧:
"mappings" : { "user" : { "properties" : { "id" : { "type" : "long", "store" : "yes" }, "name" : { "type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "myanalyzer" }, "birthday" : { "type" : "date", "store" : "yes" }, "hobby" : { "type" : "string", "store" : "no", "index" : "analyzed" }, "age" : { "type" : "integer", "doc_values_format" : "memory" } } } }
上述 json配置中,咱們給類型
user
添加了一個age
字段,假如咱們想對年齡字段進行排序,那麼給該字段設置文檔值格式的屬性是能夠提高效率的。
因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!