一、index說明
相信有不少讀者用elasticsearch的時候第一個難題就是如何創建好一個index。下面給出具體的樣例和原則,幫助大家創建一個相對適合自己業務場景的index,有助於開展后續的開發工作。
先上創建index的模板:
curl -XPUT 'http://127.0.0.1:9200/my_index_name_v1?pretty' -d '{ "aliases": { "my_index_name": {} }, "settings": { "index": { "refresh_interval": "10s", "number_of_shards" : "12", "number_of_replicas" : "1", "search.slowlog.threshold.query.warn": "5s", "search.slowlog.threshold.query.info": "1s", "search.slowlog.threshold.fetch.warn": "1s", "search.slowlog.threshold.fetch.info": "800ms", "indexing.slowlog.threshold.index.warn": "12s", "indexing.slowlog.threshold.index.info": "5s" } }, "mappings": { "my_type_name": { "properties": { "xxx_id": { "type": "keyword" }, "timestamp" : { "type": "long" }, "@timestamp" : { "type": "date" }, "xxx_status": { "type": "integer" }, "xxx_content": { "type": "text" } } } } }'
現在講該模板進行分類講解:
URI部分
http方法:首先要注意是put方法,es的http接口嚴格遵從restful風格,創建屬於put。大家在用某些工具注意選擇正確的方法,比如cerebro插件的默認方法是post,方法使用不當,除了命令執行失敗以外還有可能會污染mapping結構。
index名字:若業務類型只需要建立一個固定的index進行業務訪問,強烈推薦讓你的index名字加后綴_v1,方便后續因為主分片數調整或者調整某字段類型等原因需要reindex。若不加后綴,且沒有指定好index的別名,最終的結果是reindex需要業務線停止寫入,且需要改代碼將訪問index名字改為index的別名,這時可能會取名為xxx_v1,導致額外的工作。總之,建議index名字為your_indexname_v1,而別名為index_name。
pretty標記:建議加入,但不強制。
設置部分
refresh_interval:該設置主要是每隔多久刷新數據,可以讓剛剛寫入的數據被查到。若寫入數據量較大或者業務對於變更后及時查到的要求不高,則可以設置時間大一些。推薦一些粗糙的准則,若一天的寫入能超過100g的數據量,則建議至少設置為10s,500g設置為60s,1T以上設置為120s。具體的以當時集群硬件配置和所有index讀取寫入的情況而定。
number_of_shards和number_of_replicas:主分片數和副本分片數,推薦直接設置為12,副本分片數設置為1。具體可以參考文章:https://blog.csdn.net/tanruixing/article/details/87883896
慢日志設置:建議讀取寫入根據業務訪問情況進行設置,唯一需要注意的是不要設置過小,則可能會將磁盤打滿,甚至影響數據存儲。強烈推薦必須設置,方便后續觀察業務使用情況。
mapping部分
- type名字:一般來講,推薦一個index對應一個type,若有多個type,則所有的type的字段大部分應該是相同的。若全部不同,推薦將type設置為index的名字,分成多個index,防止由於文檔字段稀疏導致浪費存儲。
- 字段名稱包含id,推薦用keyword類型,若業務能確認一定是字符串類型,則可以用long型
- 時間戳類型,推薦為long型,方便業務訪問,或者date類型,方便kibana和grafana訪問。
- status或者type字段,推薦用integer類型,便於枚舉
- content字段,推薦確認對應的分詞器,設置為text類型,不推薦用keyword。特別是字段很長的情況。
二、命名規范:
1、inde索引命名規范:受文件系統的限制。僅可能為小寫字母,不能下划線開頭。同時需遵守下列規則:
- 不能包括 , /, *, ?, ", <, >, |, 空格, 逗號, #
- 7.0版本之前可以使用冒號:,但不建議使用並在7.0版本之后不再支持
- 不能以這些字符 -, _, + 開頭
- 不能包括 . 或 …
- 長度不能超過 255 個字符
以上這些命名限制是因為當Elasticsearch使用索引名稱作為磁盤上的目錄名稱,這些名稱必須符合不同操作系統的約定。
我猜想未來可能會放開這些限制,因為我們使用uuid關聯索引放在磁盤上,而不使用索引名稱。
2、類型:類型名稱可以包括除了null的任何字符,不能以下划線開頭。7.0版本之后不再支持類型,默認為_doc。
3、字段:對字段命名規范及不能完全使用空格。點號可以使用,但用於對象類型,舉例:
"foo.bar.baz": "abc"
相當於:
"foo": { "bar": { "baz": "abc" } }
“對象路徑”必須是有效的。所以foo . . bar,這就產生了連鎖反應,因為它不能解析到有效路徑。類似的:
"foo.": { "bar": { "baz": "abc" } }
同樣這個命名也是不容許的,因為以點號結尾會造成混淆。所以. .不能使用。
4、路由:路由命名也是除了空的任何字符。問題是多個路由值傳入查詢字符串,使用逗號分隔,如:
?routing=foo,bar
如果路由值包含逗號,會造成路由值解析錯誤。
三、Elasticsearch支持文檔中字段的多種不同數據類型
核心數據類型
字符串:text
和keyword
(text類型的數據被用來索引長文本,例如電子郵件主體部分或者一款產品的介紹,這些文本會被分析,在建立索引文檔之前會被分詞器進行分詞,轉化為詞組。經過分詞機制之后es允許檢索到該文本切分而成的詞語,但是text類型的數據不能用來過濾、排序和聚合等操作。
keyword類型的數據可以滿足電子郵箱地址、主機名、狀態碼、郵政編碼和標簽等數據的要求,不進行分詞,常常被用來過濾、排序和聚合。
綜上,可以發現text類型在存儲數據的時候會默認進行分詞,並生成索引。而keyword存儲數據的時候,不會分詞建立索引,顯然,這樣划分數據更加節省內存。)
數字:long
、integer
、short
、byte
、double
、float
、half_float
、scaled_float
日期:date
日期納秒:date_nanos
布爾:boolean
二進制:binary
范圍:integer_range
、float_range
、long_range
、double_range
、date_range
復雜數據類型
對象object:
用於單個JSON對象
嵌套nested:
用於JSON對象數組
地理數據類型
Geo-point:geo_point
表示lat/lon坐標點
Geo-shape:geo_shape
用於復雜形狀(如多邊形)
專門的數據類型
IP:ip
用於IPv4和IPv6地址
完成數據類型:completion
提供自動完成建議
令牌數:token_count
用於計算字符串中的令牌數量
mapper-murmur3:murmur3
在索引時計算值的哈希值並將它們存儲在索引中
mapper-annotated-text:annotated-text
索引包含特殊標記的文本(通常用於標識命名實體)
過濾器:接受來自query-dsl的查詢
連接:為同一索引中的文檔定義父/子關系
別名:定義現有字段的別名
排名功能:記錄數字特性以提高查詢時的命中率。
密集向量:記錄浮點值的密集向量。
稀疏向量:記錄浮點值的稀疏向量。
按類型搜索:類似文本的字段,為查詢進行優化,以實現按類型完成
數組
在Elasticsearch中,數組不需要專用字段數據類型,默認情況下,任何字段都可以包含零個或多個值,但是數組中的所有值必須具有相同的數據類型。
多字段
為不同的目的以不同的方式索引相同的字段通常是有用的,例如,字符串字段可以映射為用於全文搜索的text
字段,以及用於排序或聚合的keyword
字段,或者,你可以使用標准分析器、英語分析器和法語分析器索引文本字段。
這就是多字段的目的,大多數數據類型通過fields
參數支持多字段。
四、elasticsearch中的復合主鍵,類似MYSQL唯一索引功能
在elasticsearch 無法設置多主鍵,只有唯一ID。
但是我們可以設置ID的規則,來實現多主鍵。
比如本來想設置兩個主鍵,分別是NAME 和 AGE ,id=name_age
是因為在同一個index下,id是唯一的。
轉自:https://blog.csdn.net/tanruixing/article/details/88426009
參考:https://blog.csdn.net/neweastsun/article/details/95868716
參考:https://blog.csdn.net/kakaluoteyy/article/details/80324553
參考:https://blog.csdn.net/ahahwang/article/details/90635324