1. 程式人生 > >elasticsearch 通過HTTP RESTful API 操作數據

elasticsearch 通過HTTP RESTful API 操作數據

分組 img 兩種 should 同時 des guid search 完整

  1、索引樣例數據

    下載樣例數據集鏈接 下載後解壓到ES的bin目錄,然後加載到elasticsearch集群

    技術分享圖片

    curl -XPOST 127.0.0.1:9200/bank/account/_bulk?pretty --data-binary @accounts.json

    如果accounts.json文件和bin目錄並列:curl -XPOST 127.0.0.1:9200/bank/account/_bulk?pretty --data-binary @..\accounts.json

    技術分享圖片

    查看索引:curl localhost:9200/_cat/indices?v

    技術分享圖片

    上面結果,說明我們成功bulk 1000個文檔到bank索引中了

    刪除索引bank:curl -XDELETE http://127.0.0.1:9200/bank

  2、搜索數據API

    有兩種方式:一種方式是通過 REST 請求 URI ,發送搜索參數;另一種是通過REST 請求體,發送搜索參數。而請求體允許你包含更容易表達和可閱讀的JSON格式。

    2.1、通過 REST 請求 URI

      curl localhost:9200/bank/_search?pretty

    技術分享圖片

    pretty,參數告訴elasticsearch,返回形式打印JSON結果

    2.2、通過REST 請求體

      技術分享圖片

      curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match_all\": {} }}"

      query:告訴我們定義查詢
      match_all:運行簡單類型查詢指定索引中的所有文檔

      技術分享圖片

      除了指定查詢參數,還可以指定其他參數來影響最終的結果。

      2.3、match_all & 只返回前兩個文檔:

      技術分享圖片

      curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match_all\": {} }, \"size\" : 2}"

      技術分享圖片

    如果不指定size,默認是返回10條文檔信息

    2.4、match_all & 返回第11到第20的10個文檔信息

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match_all\": {} }, \"from\" : 10, \"size\" : 10}"

    from:指定文檔索引從哪裏開始,默認從0開始

    size:從from開始,返回多個文檔

    這feature在實現分頁查詢很有用

    技術分享圖片  

    

    2.5、match_all and 根據account 的balance字段 降序排序 & 返回10個文檔(默認10個)

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match_all\": {} }, \"sort\" : {\"balance\" : {\"order\" : \"desc\" }}}"

    2.6、比如只返回account_number 和balance兩個字段

    默認的,我們搜索返回完整的JSON文檔。而source(_source字段搜索點擊量)。如果我們不想返回完整的JSON文檔,我們可以使用source返回指定字段。

    技術分享圖片

    比如只返回account_number 和balance兩個字段

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match_all\": {} }, \"_source\": [\"account_number\", \"balance\"]}"

    技術分享圖片

    match 查詢,可作為基本字段搜索查詢  

   

    2.7、返回 account_number=20:

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match\": {\"account_number\": 20 } }}"

    技術分享圖片

    

    2.8、返回 address=mill:

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match\": {\"address\": \"mill\" } }}"

    技術分享圖片

    

    2.9、返回 address=mill or address=lane:

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match\": {\"address\": \"mill lane\" } }}"

    

    2.10、返回 短語匹配 address=mill lane:

    技術分享圖片

    curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"match_phrase\": {\"address\": \"mill lane\" } }}"

    技術分享圖片

    2.11、布爾值(bool)查詢

      返回 匹配address=mill & address=lane:

      技術分享圖片

      must:要求所有條件都要滿足(類似於&&)

      curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"bool\": {\"must\": [{\"match\": {\"address\": \"mill\" }},{\"match\": {\"address\": \"lane\" }}]}}}"

    2.12、返回 匹配address=mill or address=lane

      技術分享圖片

      curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"bool\": {\"should\": [{\"match\": {\"address\": \"mill\" }},{\"match\": {\"address\": \"lane\" }}]}}}"

      should:任何一個滿足就可以(類似於||)

     2.13、返回 不匹配address=mill & address=lane

      技術分享圖片

      curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"bool\": {\"must_not\": [{\"match\": {\"address\": \"mill\" }},{\"match\": {\"address\": \"lane\" }}]}}}"

      must_not:所有條件都不能滿足(類似於! (&&))

      

    2.14、返回 age=40 & state!=ID

      技術分享圖片

      curl -XPOST localhost:9200/bank/_search?pretty -d "{\"query\": {\"bool\": {\"must\": [{\"match\": {\"address\": \"mill\" }}],\"must_not\": [{\"match\": {\"state\": \"ID\" }}]}}}"

  3、執行過濾器

    文檔中score(_score字段是搜索結果)。score是一個數字型的,是一種相對方法匹配查詢文檔結果。分數越高,搜索關鍵字與該文檔相關性越高;越低,搜索關鍵字與該文檔相關性越低。

    在elasticsearch中所有的搜索都會觸發相關性分數計算。如果我們不使用相關性分數計算,那要使用另一種查詢能力,構建過濾器。

    過濾器是類似於查詢的概念,除了得以優化,更快的執行速度的兩個主要原因:

    1、過濾器不計算得分,所以他們比執行查詢的速度

    2、過濾器可緩存在內存中,允許重復搜索

    為了便於理解過濾器,先介紹過濾器搜索(like match_all, match, bool, etc.),可以與其他的普通查詢搜索組合一個過濾器。

    range filter,允許我們通過一個範圍值來過濾文檔,一般用於數字或日期過濾

    使用過濾器搜索返回 balances[ 20000,30000]。換句話說,balance>=20000 && balance<=30000

    

技術分享圖片
POST /bank/_search?pretty
{
  "query": {
    "bool": {
        "must":     { "match": { "age": 39 }},
        "must_not": { "match": { "employer":"Digitalus" }},
        "filter": 
        {
          "range": 
            { "balance": 
              {
                "gte": 20000,
                "lte": 30000             
              }          
            } 
        }
    }
  }
}
技術分享圖片

  3、執行聚合

    聚合提供從你的數據中分組和提取統計能力, 類似於關系型數據中的SQL GROUP BY和SQL 聚合函數。

    在Elasticsearch中,你有能力執行搜索返回命中結果,同時拆分命中結果,然後統一返回結果。當你使用簡單的API運行搜索和多個聚合,然後返回所有結果避免網絡帶寬過大的情況是高效的。

    3.1、根據state分組,降序統計top 10 state

elasticsearch 通過HTTP RESTful API 操作數據