ES之二:ES規范 index 原則


一、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索引命名規范受文件系統的限制。僅可能為小寫字母,不能下划線開頭。同時需遵守下列規則:

  1. 不能包括 , /, *, ?, ", <, >, |, 空格, 逗號, #
  2. 7.0版本之前可以使用冒號:,但不建議使用並在7.0版本之后不再支持
  3. 不能以這些字符 -, _, + 開頭
  4. 不能包括 . 或 …
  5. 長度不能超過 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支持文檔中字段的多種不同數據類型

核心數據類型

字符串:textkeyword

(text類型的數據被用來索引長文本,例如電子郵件主體部分或者一款產品的介紹,這些文本會被分析,在建立索引文檔之前會被分詞器進行分詞,轉化為詞組。經過分詞機制之后es允許檢索到該文本切分而成的詞語,但是text類型的數據不能用來過濾、排序和聚合等操作。
    keyword類型的數據可以滿足電子郵箱地址、主機名、狀態碼、郵政編碼和標簽等數據的要求,不進行分詞,常常被用來過濾、排序和聚合
    綜上,可以發現text類型在存儲數據的時候會默認進行分詞,並生成索引。而keyword存儲數據的時候,不會分詞建立索引,顯然,這樣划分數據更加節省內存。)

數字:longintegershortbytedoublefloathalf_floatscaled_float

日期:date

日期納秒:date_nanos

布爾:boolean

二進制:binary

范圍:integer_rangefloat_rangelong_rangedouble_rangedate_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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM