基於Python操作Elasticsearch__Python

來源:互聯網
上載者:User
環境依賴:

  Python:2.7
  ES依賴包:pyelasticsearch
  Elasticsearch:5.5.1 / 6.0.1
  作業系統:Windows 10 / CentOS 7

 本文主要就ES基本的CRUD操作做以歸納整理,ES官方對Python的依賴支援有很多,eg:pyelasticsearch、ESClient、elasticutils、pyes、rawes、Surfiki Refine等。博主在工作中只涉及到了pyelasticsearch,所以本文主要就該依賴做說明,其他的依賴包可詳見官網。
 pyelasticsearch依賴包的安裝命令:pip install elasticsearch

 pyelasticsearch依賴所提供的介面不是很多,下面主要從單一操作和大量操作兩大類做以討論和分析。 單一操作

插入
  create:必須指定待查詢的idnex、type、id和查詢體body;缺一不可,否則報錯
  index:相比於create,index的用法就相對靈活很多;id並非是一個必選項,如果指定,則該文檔的id就是指定值,若不指定,則系統會自動產生一個全域唯一的id賦給該文檔。
eg:

body = {"name": 'lucy', 'sex': 'female', 'age': 10}es = Elasticsearch(['localhost:9200'])es.index(index='indexName', doc_type='typeName', body, id=None)

刪除
  delete:刪除指定index、type、id的文檔

es.delete(index='indexName', doc_type='typeName', id='idValue')

尋找
  get:擷取指定index、type、id所對應的文檔

es.get(index='indexName', doc_type='typeName', id='idValue')

更新
  update:跟新指定index、type、id所對應的文檔
  

es.update(index='indexName', doc_type='typeName', id='idValue', body={待更新欄位})
大量操作

條件查詢
  search:查詢滿足條件的所有文檔,沒有id屬性,且index,type和body均可為None。
  body的文法格式必須符合DSL(Domain Specific Language )格式

query = {'query': {'match_all': {}}}# 尋找所有文檔query = {'query': {'term': {'name': 'jack'}}}# 尋找名字叫做jack的所有文檔query = {'query': {'range': {'age': {'gt': 11}}}}# 尋找年齡大於11的所有文檔allDoc = es.search(index='indexName', doc_type='typeName', body=query)print allDoc['hits']['hits'][0]# 返回第一個文檔的內容

條件刪除
  delete_by_query:刪除滿足條件的所有資料,查詢條件必須符合DLS格式

query = {'query': {'match': {'sex': 'famale'}}}# 刪除性別為女性的所有文檔query = {'query': {'range': {'age': {'lt': 11}}}}# 刪除年齡小於11的所有文檔es.delete_by_query(index='indexName', body=query, doc_type='typeName')

條件更新
  update_by_query:更新滿足條件的所有資料,寫法同上刪除和查詢

批量插入、刪除、更新
  bulk:在這重點和大家聊聊bulk方法,前面的所有方法都很簡單,唯獨這個bulk在筆者開始接觸的時候,花費了不少時間;這個方法可以同時執行多個操作,單只請求一次,從而在大量操作的時候,可以很大程度上減少程式系統開銷。此外,bulk不僅可以一次性批量執行插入、或者刪除操作,還可以在一次請求中,既可以插入、又可以刪除和更新操作。
  但是需要注意的是,任何一種操作都有固定的文檔格式,只有完全符合該格式要求,才可執行成功。廢話不多說,直接上代碼:

 doc = [     {"index": {}},     {'name': 'jackaaa', 'age': 2000, 'sex': 'female', 'address': u'北京'},     {"index": {}},     {'name': 'jackbbb', 'age': 3000, 'sex': 'male', 'address': u'上海'},     {"index": {}},     {'name': 'jackccc', 'age': 4000, 'sex': 'female', 'address': u'廣州'},     {"index": {}},     {'name': 'jackddd', 'age': 1000, 'sex': 'male', 'address': u'深圳'}, ] doc = [    {'index': {'_index': 'indexName', '_type': 'typeName', '_id': 'idValue'}}    {'name': 'jack', 'sex': 'male', 'age': 10 }    {'delete': {'_index': 'indexName', '_type': 'typeName', '_id': 'idValue'}}    {"create": {'_index' : 'indexName', "_type" : 'typeName', '_id': 'idValue'}}    {'name': 'lucy', 'sex': 'female', 'age': 20 }    {'update': {'_index': 'indexName', '_type': 'typeName', '_id': 'idValue'}}    {'doc': {'age': '100'}} ] es.bulk(index='indexName',  doc_type='typeName', body=doc)

  通過上面兩個例子可以看出,在用bulk在大量操作的時候,對於不同的操作類型,一定要與之對應一個操作頭資訊(eg:{“index”: {}}, {‘delete’: {…}}, …),否則會報TransportError(400, u’illegal_argument_exception’)的錯誤。
  說到這裡,在實際過程中,很多時候就會在此處要專門去批湊這樣的一個字典數組。假設有如下情境:
  如果要批量插入一批資料,如上述第一個例子,則在現有資料集的基礎上,很容易想到一個解決方案:通過list的奇偶合并的方法快速實現所需要的字典數組。在這推薦一種Python的技巧:[::2]和[1::2]來實現奇偶合并。具體可詳見我的部落格:Python編程技巧。

本文的完整例子可詳見我的GitHub
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.