前言

本文介绍 ElasticSearch 增加、删除、修改数据的使用示例。通过Restful 接口和 Python 实现。ES最新版本中有Delete By Query 和 Update By Query等功能,但是老版本是没有相关功能的,这里需要特别注意下。详细可参考官网资料: 
5.4版本:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html 
2.4版本:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/docs.html

事先需要安装好ElasticSearch和head插件。可参考:http://blog.csdn.net/xsdxs/article/details/52815270

Restful API 实现

创建索引

 创建索引

  1. curl -XPOST 'localhost:9200/customer?pretty'

插入数据

 单条插入-指定id

  1. curl -XPOST 'localhost:9200/customer/external/1?pretty' -d' {"name": "John Doe" }'

单条插入-不指定id

  1. curl -XPOST 'localhost:9200/customer/external?pretty' -d' {"name": "Jane Doe" }'

批量插入:

  1. curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json"

参考资料:http://blog.csdn.net/pilihaotian/article/details/52452014 
数据下载:https://raw.githubusercontent.com/bly2k/files/master/accounts.zip

删除数据

 删除数据:下面的语句将执行删除Customer中ID为2的数据

  1. curl -XDELETE 'localhost:9200/customer/external/2?pretty'

根据查询条件删除(PS:这条本人没试过,我用的还是2.4版本,这是参照官网资料的5.4版本写的)

  1. curl -XPOST 'localhost:9200/customer/external/_delete_by_query?pretty' -d '{
  2. "query": {
  3. "match": {
  4. "name": "John"
  5. }
  6. }
  7. }'

删除全部

  1. {
  2. "query": {
  3. "match_all": {}
  4. }
  5. }

更新数据

 更新文档: 修改id=1的name属性,并直接增加属性和属性值

  1. curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d ' {
  2. "doc": {
  3. "name": "xyd",
  4. "age":
  5. }
  6. }'

更新索引–脚本方式

  1. curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d' {
  2. "script": "ctx._source.age += 5"
  3. }'

Python API 实现

说明

  以下代码实现是:单条增加、根据_id删除、根据_id更新、批量增加等接口。调试的时候建议一个一个功能运行。

代码

  1. # -*- coding: utf- -*-
  2.  
  3. from elasticsearch.helpers import bulk
  4. import elasticsearch
  5.  
  6. class ElasticSearchClient(object):
  7. @staticmethod
  8. def get_es_servers():
  9. es_servers = [{
  10. "host": "localhost",
  11. "port": ""
  12. }]
  13. es_client = elasticsearch.Elasticsearch(hosts=es_servers)
  14. return es_client
  15.  
  16. class LoadElasticSearch(object):
  17. def __init__(self):
  18. self.index = "hz"
  19. self.doc_type = "xyd"
  20. self.es_client = ElasticSearchClient.get_es_servers()
  21. self.set_mapping()
  22.  
  23. def set_mapping(self):
  24. """
  25. 设置mapping
  26. """
  27. mapping = {
  28. self.doc_type: {
  29. "properties": {
  30. "document_id": {
  31. "type": "integer"
  32. },
  33. "title": {
  34. "type": "string"
  35. },
  36. "content": {
  37. "type": "string"
  38. }
  39. }
  40. }
  41. }
  42.  
  43. if not self.es_client.indices.exists(index=self.index):
  44. # 创建Index和mapping
  45. self.es_client.indices.create(index=self.index, body=mapping, ignore=)
  46. self.es_client.indices.put_mapping(index=self.index, doc_type=self.doc_type, body=mapping)
  47.  
  48. def add_date(self, row_obj):
  49. """
  50. 单条插入ES
  51. """
  52. _id = row_obj.get("_id", )
  53. row_obj.pop("_id")
  54. self.es_client.index(index=self.index, doc_type=self.doc_type, body=row_obj, id=_id)
  55.  
  56. def add_date_bulk(self, row_obj_list):
  57. """
  58. 批量插入ES
  59. """
  60. load_data = []
  61. i =
  62. bulk_num = # 2000条为一批
  63. for row_obj in row_obj_list:
  64. action = {
  65. "_index": self.index,
  66. "_type": self.doc_type,
  67. "_id": row_obj.get('_id', 'None'),
  68. "_source": {
  69. 'document_id': row_obj.get('document_id', None),
  70. 'title': row_obj.get('title', None),
  71. 'content': row_obj.get('content', None),
  72. }
  73. }
  74. load_data.append(action)
  75. i +=
  76. # 批量处理
  77. if len(load_data) == bulk_num:
  78. print '插入', i / bulk_num, '批数据'
  79. print len(load_data)
  80. success, failed = bulk(self.es_client, load_data, index=self.index, raise_on_error=True)
  81. del load_data[:len(load_data)]
  82. print success, failed
  83.  
  84. if len(load_data) > :
  85. success, failed = bulk(self.es_client, load_data, index=self.index, raise_on_error=True)
  86. del load_data[:len(load_data)]
  87. print success, failed
  88.  
  89. def update_by_id(self, row_obj):
  90. """
  91. 根据给定的_id,更新ES文档
  92. :return:
  93. """
  94. _id = row_obj.get("_id", )
  95. row_obj.pop("_id")
  96. self.es_client.update(index=self.index, doc_type=self.doc_type, body={"doc": row_obj}, id=_id)
  97.  
  98. def delete_by_id(self, _id):
  99. """
  100. 根据给定的id,删除文档
  101. :return:
  102. """
  103. self.es_client.delete(index=self.index, doc_type=self.doc_type, id=_id)
  104.  
  105. if __name__ == '__main__':
  106. write_obj = {
  107. "_id": ,
  108. "document_id": ,
  109. "title": u"Hbase 测试数据",
  110. "content": u"Hbase 日常运维,这是个假数据监控Hbase运行状况。通常IO增加时io wait也会增加,现在FMS的机器正常情况......",
  111. }
  112.  
  113. load_es = LoadElasticSearch()
  114.  
  115. # 插入单条数据测试
  116. load_es.add_date(write_obj)
  117.  
  118. # 根据id更新测试
  119. # write_obj["title"] = u"更新标题"
  120. # load_es.update_by_id(write_obj)
  121.  
  122. # 根据id删除测试
  123. # load_es.delete_by_id()
  124.  
  125. # 批量插入数据测试
  126. # row_obj_list = []
  127. # for i in range(, ):
  128. # temp_obj = write_obj.copy()
  129. # temp_obj["_id"] = i
  130. # temp_obj["document_id"] = i
  131. # row_obj_list.append(temp_obj)
  132. # load_es.add_date_bulk(row_obj_list)

结果显示

单条增加:

单条修改:

单条删除:

批量增加:

 

ElasticSearch 数据增删改实现的更多相关文章

  1. salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的标签相对简单,如果需要深入了解VF相关知识以及标签, 可以通过以下链接查看或下载 ...

  2. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  3. C#操作Excel数据增删改查示例

    Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...

  4. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  5. Webform(五)——内置对象(Response、Request)和Repeater中的数据增删改

    一.内置对象 (一)Response对象 1.简介:response 对象在ASP中负责将信息传递给用户.Response对象用于动态响应客户端请求,并将动态生成的响应结果返回到客户端浏览器中,使用R ...

  6. 日历插件FullCalendar应用:(二)数据增删改

    接上一篇 日历插件FullCalendar应用:(一)数据展现. 这一篇主要讲使用fullcalendar插件如何做数据的增删改,用到了art.dialog web对话框组件,上一篇用到的webFor ...

  7. 一个在ASP.NET中利用服务器控件GridView实现数据增删改查的例子

    备注:这是我辅导的一个项目开发组的一个例子,用文章的方式分享出来,给更多的朋友参考.其实我们这几年的项目中,都不怎么使用服务器控件的形式了,而是更多的采用MVC这种开发模式.但是,如果项目的历史背景是 ...

  8. MVC设计模式((javaWEB)在数据库连接池下,实现对数据库中的数据增删改查操作)

    设计功能的实现: ----没有业务层,直接由Servlet调用DAO,所以也没有事务操作,所以从DAO中直接获取connection对象 ----采用MVC设计模式 ----采用到的技术 .MVC设计 ...

  9. WebForm 内置对象、数据增删改、状态保持

    一.内置对象 1.Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); → ...

随机推荐

  1. Android总结之WebView与Javascript交互[转]

    Android总结之WebView与Javascript交互   前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.We ...

  2. 传智播客实战taotao项目页面菜单栏Tree的Java实现方法

    1.controller查询方法 package com.taotao.manage.controller.api; import org.springframework.beans.factory. ...

  3. 使用 git post-receive 钩子部署服务端代码

    在 git 中提交服务器源码的时候,如果能够直接更新到测试服务器,并且重启服务使其生效,会节省懒惰的程序员们大量的时间. git 的 Server-side hook (服务端钩子/挂钩)可以用来做件 ...

  4. java 线程池线程忙碌且阻塞队列也满了时给一个拒接的详细报告

    线程池线程忙碌且阻塞队列也满了时给一个拒接的详细报告.下面是一个自定义的终止策略类,继承了ThreadPoolExecutor.AbortPolicy类并覆盖了rejectedExecution方法把 ...

  5. [pip]安装和管理python第三方包

    使用 ”pip install 包名“   直接下载安装第三方包 1.在以下地址下载最新的PIP安装文件:http://pypi.python.org/pypi/pip#downloads2.下载Wi ...

  6. python 第三库卸载办法

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administrator> ...

  7. 管理多tomcat实例的shell脚本

    为了简化tomcat的部署复杂度, 把以前单独配置的脚本提出来做了一个带参数的, 可以用于单机环境下的多tomcat实例管理. 其中deploy功能, 会将指定的模块war按日期时间更名备份后, 再部 ...

  8. VS2010 lib和dll导出路径设置

    创建库文件工程时往往需要设置.lib文件和.dll文件的路径. 假设一个solution对应了多个工程,然而他们共用一些库,就可以在solution文件夹下分别添加两个文件夹lib和bin(其实放在一 ...

  9. 使用jQuery模拟鼠标点击a标签事件

    来源于:https://mo2g.com/view/42/ <html> <head> <meta charset="UTF-8"> <t ...

  10. shell脚本逐个杀死k8s中某个应用的pod

    #!/bin/bash pod01=`kubectl get pod -o wide -n weifeng-system|grep official-ui-node-prod|awk -F : 'NR ...