前言

本文介绍 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 实现

创建索引

 创建索引

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

插入数据

 单条插入-指定id

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

单条插入-不指定id

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

批量插入:

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的数据

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

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

curl -XPOST 'localhost:9200/customer/external/_delete_by_query?pretty' -d '{
"query": {
"match": {
"name": "John"
}
}
}'

删除全部

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

更新数据

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

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d ' {
"doc": {
"name": "xyd",
"age":
}
}'

更新索引–脚本方式

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

Python API 实现

说明

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

代码

# -*- coding: utf- -*-

from elasticsearch.helpers import bulk
import elasticsearch class ElasticSearchClient(object):
@staticmethod
def get_es_servers():
es_servers = [{
"host": "localhost",
"port": ""
}]
es_client = elasticsearch.Elasticsearch(hosts=es_servers)
return es_client class LoadElasticSearch(object):
def __init__(self):
self.index = "hz"
self.doc_type = "xyd"
self.es_client = ElasticSearchClient.get_es_servers()
self.set_mapping() def set_mapping(self):
"""
设置mapping
"""
mapping = {
self.doc_type: {
"properties": {
"document_id": {
"type": "integer"
},
"title": {
"type": "string"
},
"content": {
"type": "string"
}
}
}
} if not self.es_client.indices.exists(index=self.index):
# 创建Index和mapping
self.es_client.indices.create(index=self.index, body=mapping, ignore=)
self.es_client.indices.put_mapping(index=self.index, doc_type=self.doc_type, body=mapping) def add_date(self, row_obj):
"""
单条插入ES
"""
_id = row_obj.get("_id", )
row_obj.pop("_id")
self.es_client.index(index=self.index, doc_type=self.doc_type, body=row_obj, id=_id) def add_date_bulk(self, row_obj_list):
"""
批量插入ES
"""
load_data = []
i =
bulk_num = # 2000条为一批
for row_obj in row_obj_list:
action = {
"_index": self.index,
"_type": self.doc_type,
"_id": row_obj.get('_id', 'None'),
"_source": {
'document_id': row_obj.get('document_id', None),
'title': row_obj.get('title', None),
'content': row_obj.get('content', None),
}
}
load_data.append(action)
i +=
# 批量处理
if len(load_data) == bulk_num:
print '插入', i / bulk_num, '批数据'
print len(load_data)
success, failed = bulk(self.es_client, load_data, index=self.index, raise_on_error=True)
del load_data[:len(load_data)]
print success, failed if len(load_data) > :
success, failed = bulk(self.es_client, load_data, index=self.index, raise_on_error=True)
del load_data[:len(load_data)]
print success, failed def update_by_id(self, row_obj):
"""
根据给定的_id,更新ES文档
:return:
"""
_id = row_obj.get("_id", )
row_obj.pop("_id")
self.es_client.update(index=self.index, doc_type=self.doc_type, body={"doc": row_obj}, id=_id) def delete_by_id(self, _id):
"""
根据给定的id,删除文档
:return:
"""
self.es_client.delete(index=self.index, doc_type=self.doc_type, id=_id) if __name__ == '__main__':
write_obj = {
"_id": ,
"document_id": ,
"title": u"Hbase 测试数据",
"content": u"Hbase 日常运维,这是个假数据监控Hbase运行状况。通常IO增加时io wait也会增加,现在FMS的机器正常情况......",
} load_es = LoadElasticSearch() # 插入单条数据测试
load_es.add_date(write_obj) # 根据id更新测试
# write_obj["title"] = u"更新标题"
# load_es.update_by_id(write_obj) # 根据id删除测试
# load_es.delete_by_id() # 批量插入数据测试
# row_obj_list = []
# for i in range(, ):
# temp_obj = write_obj.copy()
# temp_obj["_id"] = i
# temp_obj["document_id"] = i
# row_obj_list.append(temp_obj)
# 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. 使用Newtonsoft进行JSON序列化时将枚举序列化为字符串的方法

    一.实体书写 将枚举类型的属性前面加上[JsonConverter(typeof(StringEnumConverter))]即可. 二.举例 [JsonConverter(typeof(String ...

  2. 算法笔记_231:网格中移动字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...

  3. 使用dd命令制作U盘启动盘wodim刻录光盘cd dvd

    首先格式化U盘:使用fdisk -l 查看U盘到挂载点,如我的为/dev/sdb1.卸载U盘,执行格式化命令:mkfs.vfat /dev/sdb1 然后重新挂载U盘,开始制作启动盘: 1.# dd  ...

  4. ODI---->Variables

    一.变量简介 变量存储的是一个单一的值,既可以是数字,也可以是字符或者日期.不能为数组. ODI的变量分为两种,全局变量和项目变量. 顾名思义,项目变量定义的变量只可以在本项目中使用,其它项目无法调用 ...

  5. Oracle Data Integrator 12c----一致性 CDC(Consistent CDC)

    一致性 CDC 中引入了变化集的概念.一个变化集中可以包括多个相互存在关联关系(如主外键引用关系)的表.CDC 在捕获和发布一个变化集中的变化时能够保证数据的一致性.这个练习介绍如何使用能够保证一致性 ...

  6. Ubuntu14.04设置开机自启动脚本

    方法一.编辑rc.loacl脚本  Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.在 exit 0 前面添加好脚本代码, ...

  7. docker overlay存储驱动介绍(传送门)

    https://blog.csdn.net/u010278923/article/details/79215828

  8. python实现的摩斯电码解码\编码器

    代码地址如下:http://www.demodashi.com/demo/14743.html 详细说明: 现在这年头谍战片.警匪片动不动就用摩斯密码来传递信息,一方面可以用来耍帅,另外一方面好像不插 ...

  9. shell 脚本启动spring boot的jar 包

    #!/bin/bash # kill java进程 java_sso_prod_pid=`ps aux|grep sso.jar|grep -v "grep"|awk '{prin ...

  10. Java之——Web项目中DLL文件动态加载方法

    本文转自:https://blog.csdn.net/l1028386804/article/details/53903557 在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来 ...