天天看點

elasticsearch 基礎 文法總結 - 張玉坤

elasticsearch 基礎 文法總結

1. es 使用 restful 風格的 api

  備注: es 的 api  格式  基本是這個樣     請求方式    /索引名/文檔名/id?參數   ,但是 還有 很多不是這樣的 請求,比如 _cat api  等等........

2. 查詢 所有索引 get /_cat/indices

3.檢視節點健康 get /_cat/health?v

4.?v 的意思 顯示列出項 的title

5.?pretty 結果 json 格式化的方式輸出

6.添加索引  put /test1

7. 添加一條 docment( 如果已經存在 那麼久全部覆寫)

PUT /test1/d1/1
{
"age":1,
"name":"zs",
"bri":"2018-08-08"
}      

  備注1:如果已經存在就全覆寫修改。

  備注2:如果 隻需要插入,不修改 着 在後面 加上 /_create (這時候會提示已經存在),post 不能帶_create

8.修改 一條文檔 

POST /test1/d1/2
{
  "age":1,
  "name":"zs",
  "bri":"2018-08-08"
}      

  備注: post 雖然叫做修改,但是 在帶有id 的情況下 和 put 幾乎一樣(id 存在就是 全量 修改,不存在就是 新增)。

  備注2: 可以 使用  POST /test1/d1  不帶id 的方式 自動生成id,put 不支援不帶id的寫法。

  備注3 post 可以 指定_update  ,并且 可以帶_create。

  備注4:post 可以部分更新 專用名字  partial update 

      

POST /test1/d1/5/_update
{
  "doc":{
    "age":2
  }
}      

9.删除一條文檔      DELETE  test1/d1/5

10. 删除一條索引    DELETE  test1

11. 關于 primary shard  和 replica shard 的解釋

    primary shard:se 對資料進行切片 ,吧一個索引的 資料 分成多份 ,每一份資料就是一個  primary shard, primary shard 的數量隻能在建立索引的時候指定,因為後期 修改  primary shard 數量 會亂 文檔id 計算 文檔所在 shard 的 結果。

   replica shard: 副本節點,多個副本節點可以提高資料的安全性,并且可以分擔 primary shard 的查詢 負載。

  備注: 修改隻能發生在 primary shard ,查詢可以發生在任意 shard 。

12.查詢單條 文檔    get user/student/2

13. 搜尋文檔  get user/_search   或者 get user/syudent/_search

  備注:查詢可以不指定 type 的類型 

14  url 的查詢  get user/_search?-q=name2 ,+q是預設的,-q便是 不存在這樣的資料

  備注:沒有指定查詢字段,使用的 一個特俗的 包含全部字段的字段查詢的。

15  指定 字段 url 的查詢   get user/student/_search?q=name:n5

  備注:+q=name:n5&q=name:n5

16  url query 的方式很難應 複雜查詢 是以我們一般使用  json 格式的請求體的方式

  備注:es restful 風格api 的 get 請求 支援請求體

17 查詢 所有 

  

get /user/student/_search
{
    "query":{
      "match_all": {}
    }
  
}      

18 指定字段查詢

  

get /user/student/_search
{
    "query":{
      "match": {
        "name": "n5"
      }
    }
  
}      

19 範圍 查詢

  

get /user/student/_search
{
    "query":{
      "range": {
        "bri": {
          "gte": 10,
          "lte": 20
        }
      }
    }
  
}      

20 多條件的 複合 查詢 

  

get /user/student/_search
{
    "query":{
      "bool": {
        "must": [
          { "match": {
            "FIELD": "TEXT"
          }}
        ],
        "should": [
          {"match": {
            "FIELD": "TEXT"
          },
          "match": {
            "FIELD": "TEXT"
          }
            
          }
        ],
        "minimum_should_match": 1
        
      }
    }
  
}      

備注:bool 裡面的 都是一些 條件 ,must 必須瞞足,should 隻要要滿足 minimum_should_match 個 條件是ture ,filter 隻是過濾 不計入評分。

21:  查詢非分頁 

get /user/student/_search
{
    "query":{
      "match_all": {}
    },
    "from":3,
    "size":2
  
}      

  備注:深分頁問題,效率會很低,勁量避免深分頁。

  備注2:深分頁:如果要查詢出 每頁 100 條,的第 100 頁資料資料( 9900 - 10000 ),如果是去5 個節點查詢,那麼會在 每個節點查詢出 第 9900- 10000 條資料,然後 彙總到 坐标幾點,然後排序後取出 9900-10000 條,這樣做非常占 資源。

22. scoll 遊标查詢,指定 scroll=時間 ,指定儲存的分鐘數,第一次發起請求放回的不是資料,而是 _scroll_id ,後面通過 _scroll_id 去請求資料,非常适合大批量查詢。

 

get /user/student/_search?scroll=1m
{
    "query":{
      "match_all": {}
    },
    "size":2
  
}      
GET /_search/scroll
{
    "scroll": "1m",
    "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAIuFkRMbVZ0WFdvU1ZHWEJuelFIQk4tdFEAAAAAAAACLBZETG1WdFhXb1NWR1hCbnpRSEJOLXRRAAAAAAAAAi0WRExtVnRYV29TVkdYQm56UUhCTi10UQAAAAAAAAO1FlQwSkJqVng5UVpPUTIwbWw0a0NKV3cAAAAAAAADthZUMEpCalZ4OVFaT1EyMG1sNGtDSld3"
}      

 備注:遊标 查詢 是在 es 裡面緩存了結果 ,然後一次 一次的去取 是以發起 第一次請求的時候隻有 size ,沒有from ,後面的 請求隻有 scroll_id 和  scroll 時間

23: 隻 顯示指定結果 ( _source )

  

GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["bri"]
}      

24: post_filter  和 query 的 差別 ,文法上沒差別,唯一的在于 filter 不評分,是以 filter  比 query  快很多 ,filter 和query  可以共存。

GET /user/_search
{
  "post_filter": {
    "match_all": {}
  },
  "_source": ["bri"]
}      

25 聚合函數  球了平均值和 總數量

 

GET  user/student/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "total_count": {
      "value_count": {
        "field": "age"
      }
    },
    "pjz":{
      "avg": {
        "field": "age"
      }
    }
    
  }
  
}      

26:分組 

GET  user/student/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "fz": {
      "terms": {
        "field": "age"
      }
    }
  }
  
}      

27 : 遇到 Fielddata is disabled on text fields by default 異常的 解決方案

  因為text類型預設沒有正排索引,是以不支援排序 和聚合 ,遇到這種 異常的時候 需要制定 開啟正排索引。

  反向索引用于搜尋,正排索引用于排序和聚合。

28:開啟正排索引的方法。

  

put user/_mapping/student/
{
  "properties": {
    "sex": { 
      "type":"text",
      "fielddata":true
    }
  }
}
      

  

29: 批查詢 api mget 

#批量查詢
GET /_mget
{
  "docs":[
    {
      "_index":"user",
      "_type":"student",
      "_id":1
    },
    {
      "_index":"user",
      "_type":"student",
      "_id":2
    },
    {
      "_index":"user",
      "_type":"student",
      "_id":2
    }
  ]
}      

備注:mget  如果請求url 裡面有 index 和 type 後面 的 請求體裡面就可以不寫  index 和type

 如:

#批量查詢
GET /user/_mget
{
  "docs":[
    {
      "_type":"student",
      "_id":1
    },
    {
      "_type":"student",
      "_id":2
    },
    {
      "_type":"student",
      "_id":21111111
    }
  ]
}      

 30 批處理 bulk  

      bulk的格式:action:index/create/update/delete 後面如果有請求體就跟上請求體

    

GET _bulk
{"create":{"_index":"user","_type":"student","_id":"100"}}
{ "name": "zhaoer","age": 7,  "sex": "nn"}
{"update":{"_index":"user","_type":"student","_id":"100"}}
{"doc":{ "name": "zhaoer","age": 7,  "sex": "nn"}}
{"delete":{"_index":"user","_type":"student","_id":"100"}}
{"index":{"_index":"user","_type":"student"},"_id":"100"}
{"doc":{ "name": "zhaoer","age": 7,  "sex": "nn"}}
      

  備注:delete 沒有請求體。

  備注2:create 和 update 隻有在指定的狀态才能成功 create 建立 ,update 更新。

  備注3 ,批進行中的一個 失敗不影響 其他的 執行。 

  備注4 ,update 需要 doc 包一層

  備注5 ,index 有create 和 update 的 功能,并且支援  又或者 沒有 doc 包一層都支援。

31 ,es  的删除是 是假删除并且在下一次merge的時候真删除

32,es的 并發處理 ,使用的樂觀鎖 在 後面加上 version

  

POST  /user/student/1?version=3
{
  "name":"zyk",
  "age":0
}      

備注:隻有version = 目前記錄的version的時候才能修改成功

33.es 可以自動控制 vserion 通過 ,version_type指定 ,

version_type=external 要求 version 大于目前的version ,      
version_type=internal 這個是預設值 ,必須等于目前的值
version_type=external_gte 大于等于目前的version
version_type=force 已經廢棄了不能用了,我也不知道以前什麼意思,提升, Validation Failed: 1: version type [force] may no longer be used      

  

POST  /user/student/1?version_type=external&version=505
{
  "name":"zyk",
  "age":0
}
      

  

34 ,使用 consistency 指定寫一緻性 的等級  (可能廢除了,在6.0 不生效)

consistency=one 隻要主節點活着就可以寫

consistency=all 所有主節點和副本節點都活着

consistency=quorun 所有主節點都活着,并且有超過一半的節點(primary shard + replica shard )活着 ,這個是預設值,而且隻有在有副本節點的時候才生效

等待 這時候可以指定 timeout 來指定等待時間timeout=30s

35 查詢 索引 的設定

GET /user/_settings
      

36 檢視 索引的 mapping

  

GET user/_mapping      

37動态的 mapping  es  或根據第一次存入的資料,動态的決定這個字段的 mapping 類型,并且決定索引行為,後面類型不符合就沒法存入,mapping 裡面的 類型不能修改,隻能添加新的。

put /test2/t/1
{
  "age":1,
  "name":"name",
  "bri":"2017-09-09",
  "isDel":true,
  "amount":0.1
}

GET /test2/_mapping      

38, 指定 mapping 隻能給新的索引指定 ,或者 個新的字段指定

  

PUT /test2/_mapping/t
{
  "properties": {
          "age": {
            "type": "long"
          },
          "amount": {
            "type": "float"
          },
          "bri": {
            "type": "date"
          },
          "isDel": {
            "type": "boolean"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
}      

39,指定 索引的 setting 

PUT test3
{
   "settings": {
      "index": {
        "number_of_shards": "3",
        "number_of_replicas": "1"
      }
    }
  
}
      

  

PUT test4/_settings
{
  "index": {
        "number_of_replicas": "4"
      }
}
      

  備注:number_of_shards 不能修改

40:mapping 裡面 keyword 的可以指定 text 的子類型

41: 如果 字段類型是 json ,那麼這個字段的類型就是 object ,或者說是docment 這時候  mapping 裡面是 映射了一個property

42 es 2.X  的 時候string 現在改成  keyword 和 text ,keyword 是存不分詞的 的關鍵資料,text 存大資料,要分詞,

  可以個text 類型 指定fields 來指定 一個 不分詞的原文,用于 排序聚合

  

"name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          }
      

  備注:和2.X的 raw 類似。

43,query phase 指的的查詢的 查詢請求,->坐标節點分發請求到對應 shard ,然後 結果彙總到 坐标節點的過程。

44, fetch phase 指的是 查詢結果的doc id 到各個 shard 取文檔的過程。

45 通過 preference 指定 取那些節點查詢。

  preference = _primary,_primart_first,_local,_only_node:xyz,_prefer_node:xyz,_shard:2,3

46 . timeout  指定多少時間之内要傳回,到了時間一定會傳回,即便沒有查詢完,隻傳回查到的部分。

47. routing , 預設是通過id 路由的。 可以讓類似的結果在同一個 shard 上。

curl -XPOST \'http://localhost:9200/store/order?routing=user123\' -d \'
{
    "productName": "sample",
    "customerID": "user123"
}\'           

48 searche_type

  

1、query and fetch

向索引的所有分片(shard)都發出查詢請求,各分片傳回的時候把元素文檔(document)和計算後的排名資訊一起傳回。這種搜尋方式是最快的。因為相比下面的幾種搜尋方式,這種查詢方法隻需要去shard查詢一次。但是各個shard傳回的結果的數量之和可能是使用者要求的size的n倍。

2、query then fetch(預設的搜尋方式)

如果你搜尋時,沒有指定搜尋方式,就是使用的這種搜尋方式。這種搜尋方式,大概分兩個步驟,第一步,先向所有的shard送出請求,各分片隻傳回排序和排名相關的資訊(注意,不包括文檔document),然後按照各分片傳回的分數進行重新排序和排名,取前size個文檔。然後進行第二步,去相關的shard取document。這種方式傳回的document可能是使用者要求的size的n倍,此處勘誤,這是原部落格中的錯誤,經測試 query then fetch 方式傳回的數量就是 查詢是 setSize()的數量

3、DFS query and fetch

這種方式比第一種方式多了一個初始化散發(initial scatter)步驟,有這一步,據說可以更精确控制搜尋打分和排名。這種方式傳回的document與使用者要求的size是相等的。同樣勘誤 DFS query and fetch 傳回結果的數量是 分片數*size

4、DFS query then fetch

比第2種方式多了一個初始化散發(initial scatter)步驟。這種方式傳回的document與使用者要求的size是相等的。

49 Bouncing Results

  搜尋同一query,結果ES傳回的順序卻不盡相同,這就是請求輪詢到不同分片,而未設定排序條件,相同相關性評分情況下,由于評分采用的算法時TF(term frequency)和IDF(inverst document frequecy) 算出的總分在不同的shard上時不一樣的,那麼就造成了預設按照_score的分數排序,導緻會出現結果不一緻的情況。查詢分析時将所有的請求發送到所有的shard上去。可用設定preference為字元串或者primary shard插叙等來解決該問題。preference還可以指定任意值,探後通過這個值算出查詢的節點

elasticsearch 基礎 文法總結 - 張玉坤

 50  type  其實就是一個 隐藏的 field 

51  mapping root object 就是指 索引mapping 的json對象

52 給索引取一個名字 

  put user/_aliases/user_al

  或者:

  

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "user",
        "alias": "user_a"
      }
    },
    {
      "add": {
        "index": "user",
        "alias": "user_b"
      }
    }
  ]
}      

  備注: 對個索引可以使用同一個别名

 53 查詢 别名 

  get /user/_alias

54 删除别名 

  

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "user",
        "alias": "user_a"
      }
    },
    {
      "remove": {
        "index": "test",
        "alias": "user_b"
      }
    }
  ]
}
      

 

55 自定義 分詞器

PUT /user5
{
  "settings":{
    "analysis": {
      "char_filter": {
        "my_char_filter":{
          "type":"mapping",
          "mappings":["&=> and"]
        }
      },
      "filter": {
        "my_filter":{
          "type":"stop",
          "stopwords":["the","a"]
        }
      },
      "analyzer": {
        "my_analyzer":{
          "type":"custom",
          "char_filter":[ "my_char_filter" ],
          "filter":["my_filter"],
          "tokenizer":"standard"
        }
      }
    }
  }  
}
      

  解釋:定義了一個 char_filter  名叫 my_char_filter,類型是 mapping 把& 轉成 and 

    定義了一個 filter 名叫 my_filter ,類型是停用詞,把 the ,a  去掉

    定義了一個分析器 名叫 my_analyzer, 類型是自定義,它使用了 char_filter 是 my_char_filter ,它使用的 filter 是 my_filter ,它使用的 分詞器是 标準分詞器。

例子二:

PUT /user9
{
  "settings":{
    "analysis": {
      "char_filter": {
        "my_char_filter":{
          "type":"mapping",
          "mappings":["& => and", "pingguo => pingg"]
        }
      },
      "filter": {
        "my_filter":{
          "type":"stop",
          "stopwords":["the","a"]
        }
      },
      "analyzer": {
        "my_analyzer":{
          "type":"custom",
          "char_filter":[ "my_char_filter" ],
          "filter":["my_filter"],
          "tokenizer":"standard"
        }
      }
    }
  }  
}


GET /user9/_analyze
{
  "analyzer":"my_analyzer",
  "text":" a d&og is in the house pingguo"
}
      

  

56 自定義 動态mapping 

PUT my_index1
{
  "mappings": {
    "_doc":{
      "dynamic":"strict",
      "properties":{
        "name":{
          "type":"text"
        },
        "user":{
          "type":"object",
          "dynamic":"true"
        }
        
      }
    }
  }
}
      

  

GET my_index1/_doc/1
{
 "name":"name1",
 "user":{
   "name":"n1",
   "age":10
 },
 "age":2
 
}
      

 mapping的第一層,也就是 properties的 那一層,不允許動态映射,有新的字段就報錯,

 user的那一層,允許動态映射,有新的字段就根據 新的第一次的值,指定類型。

  dynamic = false 的時候  會存進去,但是我試了一次,不管 1 還是  "1"都可以存進去,但是 也可以檢視得到,但是好像搜尋不到。

57 document 寫入原理

  每次寫請求寫入到 記憶體 buffer ,當 寫到一定程度的時候,重新整理,buffer 寫到 lucene 的 segment,大概1 秒一次。segment 會吧資料寫到 oscache ,然後執行 fsysc  指令吧  歐式chache 寫到disk中。删除的時候是加删除,在index segment 中建立一個.del檔案,在一定時候index segment  合并的時候,會删除這個del檔案。更新,先執行删除,然後在執行插入。值得注意的是,沒個一秒 buffer 送出一次,并且産生一個新的 segment,而且,這時候會出發 segment 到 oscache 的送出。資料送出到 os cache 的 以後就可以搜尋到了,是以這就是 1 秒 近實時的原因。可以給index指定重新整理的時間。  refresh_interval,并且 es 還會寫 tranlog(寫buffer的同時)檔案,這個檔案可以避免丢失。每次送出會建立一個tranlog 檔案,送出完成會删除原來的 tranlog 檔案。在送出以後記錄會寫到新的 tranlog 中。

58. 檢視 一段文本是在某個分詞器上是怎麼分詞的。

GET /user/_analyze
{
  "analyzer": "standard",
  "text":  " a dog is in the house"
  
}
      

59 : 給指定 字段指定指定的分詞器

put /user3/_mapping/student
{
  "properties":{
    "name":{
      "type":"text",
      "analyzer":"standard"
    }
  }
  
}
      

  

 60: dynamic 政策 三種 ,true (遇到陌生字段就 dynamic mapping ),false(遇到陌生字段就忽略) ,strict(遇到陌生字段就報錯)

61:post /my_index/_optimize?max_num_segments=1

  手動使  索引 merge

上一篇: POJ ACM 1047