es筆記---新建es索引


es對索引的一堆操作都是用restful api去進行的,參數時一堆json,一年前邊查邊寫搞過一次,這回搞遷移,發現es都到6.0版本了,也變化了很多,寫個小筆記記錄一下。

創建一個es索引很簡單,一個put請求。

PUT /my_index
{
    "settings": { ... any settings ... }, "mappings": { "type_one": { ... any mappings ... }, }, "aliases" : {...} } 

新建一個索引,包含settings mappings 和aliases。settings設置分片等一些參數,mappings設置如何處理索引的各個type,aliases以前沒有用過,看上去我不太會用到,這邊就不記錄了。

settings

這邊有非常多的參數可以設置,不過官方是不建議修改的。常見需要改的就倆

  • number_of_shards
    每個索引的主分片數,默認值是 5 。這個配置在索引創建后不能修改。
  • number_of_replicas
    每個主分片的副本數,默認值是 1 。對於活動的索引庫,這個配置可以隨時修改。
PUT /my_temp_index
{
    "settings": { "number_of_shards" : 3, "number_of_replicas" : 2 } } 

給索引設置settings值

PUT /my_temp_index/_settings
{
    "number_of_replicas": 1 } 

修改settings值

mappings

每個文檔都有type,每種type都會有自己的mapping。mapping定義了type的field,每個field的數據類型,以及es如何處理這些field。

注意,一個mappings里邊不建議有多個type,而且在es6之后的版本很有可能會不允許有多個type。

按照官方的計划,es7-es9會逐步去掉type

建議是每個index都只有一個type,原因是一個index中的各個type的字段並不是完全獨立的,一個index中多個type會造成一些浪費。

可以通過/_mapping 來查看es中一個或多個索引中的一個或多個mapping。

數據類型 (field)

  • 字符串 string
    • text
    • keyword
  • 數字
    • long integer short byte double float half_float scaled_float
  • 布爾型 boolean
  • 日期 date
  • range
    • integer_range
    • float_range
    • long_range
    • double_range
    • date_range
  • array
  • object

還有很多我確定我不會用到的類型。

當索引一個包含新的field的文檔時,es會使用<b>動態映射</b>,通過JSON中基本數據類型,嘗試猜測field類型

一般情況下,默認映射就足夠了。es會自動把如 123 映射為integer,123.123映射為double,但是很多情況下,我們都需要自定義映射,特別是string類型。

自定義映射可以做這些事:

  • 配置為全文字符串和精確字符串 (如name字段我更希望他不要分詞,而desc字段更需要分詞后搜索)
  • 使用特定語言分析器
  • 。。。

一個field最主要的屬性是type,對於大部分field,一般只需要設置type就可以了:

{
    "number_of_clicks": { "type": "integer" } } 

range

PUT range_index
{
  "mappings": { "my_type": { "properties": { "expected_attendees": { "type": "integer_range" }, "time_frame": { "type": "date_range", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } } 

插入格式

PUT range_index/my_type/1
{
  "expected_attendees" : { "gte" : 10, "lte" : 20 }, "time_frame" : { "gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01" } } 

搜索格式

POST range_index/_search
{
  "query" : { "range" : { "time_frame" : { "gte" : "2015-10-31", "lte" : "2015-11-01", "relation" : "within" } } } } 

這部分比較簡單 不細致展開了

string

對於string類型,以前是只有string,現在分為了兩種,keyword和text

text

text會先經過分析器,然后索引起來,類似desc這樣的字段就需要使用text。有以下幾個重要字段。

analyzer

分析器,可以指定如何處理這個string,比如我想先把所有html的標記全去掉,再分詞,再刪除無用的停頓次,然后把剩下的token索引起來。可以使用默認的standard分析器,也可以指定別的內置的分析器。也可以使用插件安裝的第三份分析器,如ik,也可以自定義分析器。

分析器使用起來很簡單

{
    "desc": { "type": "string", "analyzer": "ik_smart" } } 

其中,ik_smart是已經安裝好的第三方分析器。

index

是否設置為可以搜索,boolean

norm

我理解是算分時是否進行一些標准化處理,需要額外的資源。

fields

這個字段很有趣.. 先看個例子

"filename":{ "type":"text", "norms":false, "fields":{ "raw":{ "type":"keyword", "ignore_above":256 } } }, 

一個filename的字段,這邊設置的是type是text,會分詞搜索。但有時候我們需要精准匹配,就可以使用filename.raw。插入時只需要輸入filename,保存在es里邊的會有兩份,filename和filename.raw。

keyword

和text不同,keyword不會經過分析器,搜索時會精確匹配。

index fields

這兩個參數和text的相同

ignore_above

丟掉超過一定長度的字符串


映射操作
新建映射
PUT /index_name
{
  "mappings": { "person" : { "properties" : { "desc" : { "type" : "string", "analyzer": "ik_smart" }, "birth" : { "type" : "date" }, "name" : { "type" : "string", "index" : "not_analyzed" }, "user_id" : { "type" : "long" } } } } } 

新建一個index,desc字段用ik分詞索引,birth設置為日志,name字段精確索引,user_id設置為long型。

更新映射
PUT /index_name/_mapping/person
{
  "properties" : { "tag" : { "type" : "string", "index": "not_analyzed" } } } 

新增一個tag字段。



作者:辰辰沉沉沉
鏈接:https://www.jianshu.com/p/bd23b86848dd
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

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



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