【Elasticsearch】增刪改查

ES的概念

• 分佈式的實時文件存儲,每個字段都被索引並可被搜索
• 分佈式的實時分析搜索引擎
• 可以擴展到上百臺服務器,處理PB級結構化非結構化數據

ES的特點

  • JSON存儲屬於文檔存儲
  • 採用倒排索引  
  • 沒有事務

名詞解釋

RestFul是一種軟件架構的設計風格(不是標準),通過 HTTP接口處理數據,主要用於客戶端和服務器的數據交互。

該風格的具體特點:在服務器端,應用程序對象、數據庫記錄、算法、文本、圖片等都是一個實體資源,使用 URI標識,所有資源都共享統一的接口(標準的HTTP方法)比如 GET(獲取資源)、PUT(更新資源)、POST(創建或更新資源) 和 DELETE(刪除資源),在客戶端和服務器之間傳輸數據。

分詞模式:“醫藥大學”,在搜索時可以看作是“醫藥”、“大學”、“醫藥大學”

分佈式:1)可擴展支持一主多從且簡易擴容,只要cluster.name一致且在同一個網絡中就能自動加入當前集羣;2)高可用:在一個集羣的多個節點中進行分佈式存儲,索引支持shards和複製,即使部分節點down掉,也能自動進行數據恢復和主從切換。

正排索引:從文檔的角度去看其中的單詞,表示每個文檔含有多少單詞,其中每個單詞出現多少次,及出現的位置(相對於文檔首部的偏移量)。

倒排索引:從單詞角度看文檔,標識每個單詞分別在那些文檔中出現(文檔ID),以及在各自的文檔中每個單詞分別出現了多少次(詞頻)及其出現位置(相對於該文檔首部的偏移量)。

ES和MYSQL數據庫的對應關係


 

ES常用操作

ES新增:方式/索引/類型/ ID

POST   /megacorp/employee/ 1

{   "first_name":"John",
    "last_name":"Smith",
    "age":25,
    "about":"I love to go rock climbing",
    "interests":["sports","music"] }

相當於MYSQL裏的:

Insert into megacorp.employee(first_name,last_name,age,about,interests) values ("John","Smith",25, "I love to go rock climbing","sports")

Insert into megacorp.employee(first_name,last_name,age,about,interests) values ("John","Smith",25, "I love to go rock climbing","music")

ES修改:方式/索引/類型/(eg:把smith的about改成‘nothing'

POST /megacorp/employee/_update_by_query

{“query”:{
    “match_phrase”:{“last_name”: “Smith”}
},
“script”:{
    “source”: “ctx._source[‘about’]=‘nothing'"
}}

相當於MYSQL裏的:
Update megacorp.employee set about=‘nothing’
where last_name like ‘% Smith %’

ES刪除:方式/索引/類型/ID (eg:刪除最後一個名字爲smith的記錄)

POST /megacorp/employee/_delete_by_query

{
“query”:{
    “match_phrase”:{“last_name”: “Smith”}}

}

相當於MYSQL裏的:
Delete from megacorp.employee
where last_name like ‘%Smith%’

ES查詢:GET/索引/類型/ _search

1. term查詢和terms查詢

term query會去倒排索引中尋找確切的term,它並不知道分詞器的存在

term:查詢某個字段裏含有某個關鍵詞的文檔

GET /user/student/_search

{
  "query": {
    "term": {
      "name":"lihua"
    }
  }
}

terms:查詢某個字段裏含有多個關鍵詞的文檔

GET /user/student/_search

{
  "query": {
   "terms": {
      "name": [
        "lihua",
        "lier"
     ]
    }
  }
}

2 match查詢

match query知道分詞器的存在,會對filed進行分詞操作,然後再查詢

GET /user/student/_search

{
  "query": {
    "match": {
      "name":"lihua"
    }
  }
}

match_all:查詢所有文檔

GET /user/student/_search

{
  "query": {
    "match_all": {}
  }
}

multi_match:可以指定多個字段

GET /user/student/_search

{

  "query": {
    "multi_match": {
      "query": "lihua",
      "fields": ["name","course.name"]
    }
  }

}

match_phrase:短語匹配查詢

GET /user/student/_search

{
  "query": {
    "match_phrase": {
      "name": "lihua"
    }
  }
}

3. from查詢:

從哪一個文檔開始 size:需要的個數(簡單分頁查詢)

GET /user/student/_search

{
  "from": 0,
  "size": 2
}

4. Sort實現排序:

desc:降序,asc升序(查詢排序)

GET /user/student/_search

{
  "query": {
    "match_all": {}
  },
  "sort": [ { "age": { "order":"asc" } } ]
}

5. 過濾查詢post_filter:

把查詢qury換成post_filter,過濾查詢速度要快一點

GET /user/student/_search

{
  "post_filter": {
    "match": {
      "name": "lihua"
    }
  }
}

6.條件組合查詢:

查詢名字爲lihua,年齡12歲的數據

POST /user/student/_search

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": "lihua"
          }
        },
        {
          "term": {
            "age": 12
          }
        }
      ]
    }
  }
}

ES在python中的使用

from elasticsearch import Elasticsearch

#建立連接
es = Elasticsearch(['99.14.234.17'],port=9200)

#新增記錄

body ={"first_name":"Jane","last_name":"Smith","age":32,
"about":"I like to play games", "interests":["tv_games"]} es.index(index="megacorp",doc_type="employee",body=body)


#通過查詢修改相關記錄 body={"script":"ctx._source['last_name']='new_last_name'", "query":{"match":{"age":32}}}
es.update(index="megacorp",doc_type="employee",body=body)


#通過查詢刪除記錄
body={"query":{"match":{"age":32}}} es.delete_by_query(index="megacorp",doc_type="employee",body=body)


#查詢
body={"query":{"match":{"age":32}}}
req = es.search(index="megacorp",doc_type="employee",body=body)
print req

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章