Reference:  http://bigg.top/2015/11/29/elasticsearch%E7%9A%84python%E5%A2%9E%E5%88%A0%E6%9F%A5%E6%94%B9%E5%AE%9E%E4%BE%8B%E5%88%86%E6%9E%90/

  • ES的部署请查看相关文档,我这里就不在赘叙。提醒,官方建议ES的在60G以上内存的环境下运行,如果你的服务器的内存是16G,建议至少需要4台机器。
  • ES连接到服务器比较容易,如下:
import elasticsearch

class ES(object):
@classmethod
def connect_host(cls):
hosts=[{"host": "xx.xxx.x.xx"},
{"host": "xx.xxx.x.xx"},
{"host": "xx.xxx.x.xx"},
{"host": "xx.xxx.x.xx"},]
es = elasticsearch.Elasticsearch(
hosts,
sniff_on_start=True,
sniff_on_connection_fail=True,
sniffer_timeout=600
)
return es

查询操作

  • 通过对RESTAPI的改造,可以很容易实现查询功能。如下,实现了对一个domain相关doc的查询,筛选条件包括起止时间,数据排列顺序和限制查询数据的个数。
def es_query(domain="", start=None, end=None, reverse=False, limit_cnt=20, category=0):
es = ES.connect_host()
now = datetime.datetime.now()
if reverse:
order = "desc"
else:
order = "asc"
if not start:
start = now - datetime.timedelta(weeks=2000)
if not end:
end = now
range_body = {
"range": {
"time": {
"gte": start,
"lte": end
}
}
}
and_list = [range_body]
domain_body = {
"term": {
"domain": domain
}
}
category_body = {
"term": {
"category": category
}
}
if domain:
and_list.append(domain_body)
if category:
and_list.append(category_body)
q_body = {
"size": limit_cnt,
"sort": [
{
"time": {
"order": order
}
}
],
"query": {
"filtered": {
"query": {"matchAll": {}},
"filter": {
"and": and_list
}
}
}
}
res = es.search(body=q_body)
ret = []
for hit in res["hits"]["hits"]:
value = {}
src = hit["_source"]
if src:
try:
the_time = src["time"]
if len(the_time) < 20:
value["time"] = datetime.datetime.strptime(the_time, "%Y-%m-%dT%H:%M:%S")
else:
value["time"] = datetime.datetime.strptime(the_time, "%Y-%m-%dT%H:%M:%S.%f")
ret.append(value)
except Exception as e:
print str(e)
ret = []
print "Query xxxxx data failed!"
return ret
  • 其中,reverse表示数据排列的顺序,linit_cnt表示限制数量。其中涉及range,sort,size,filter,and等来执行es.search操作。最后一个for循环是一个取数据的过程。
  • 在实际应用过程中,对于一个复杂的查询,第一次操作失败率很高,如果查询结果有几千个,第一次的query查询到的success个数通常只有1/3左右。当然,当你用该查询条件再次查询时,可以瞬间得到完全成功的结果,所以在你对查询成功个数要求比较高的情况下,建议多次发起请求,这样可以得到比较完整的结果。

删除操作

  • ES的查询分为按index删除和按doc删除。按index查询相对比较容易理解,即删除该索引下的所有数据,删除之后该索引就不存在了。但是有时我们会碰到一些按照doc的情况,即按照一定的query条件查询到相关的doc,然后删除相关的所有记录。ES官方不推荐进行这种操作,而且还有一定的失败率。如果一定需要这方面的功能,证明你的数据不适合用ES进行存储。
  • 由于我当时对ES的认识不够,把大量的数据存储在了ES,因此对doc的删除操作需求比较大,写了一个删除操作功能(仅供参考,不建议使用,如果需要删除,建议存储数据之前设计好数据结构,方便以index为单位删除)
def es_delete(domain, m_type="xxxx"):
m_data = {
"query": {
"query_string": {
"query": "domain: %s AND type: %s" % (domain, m_type)
}
}
}
data = json.dumps(m_data)
request = urllib2.Request(QUERY_URI, data)
request.get_method = lambda: "DELETE"
urllib2.urlopen(request)
print "Deleted the data!"

更新操作

  • ES不适合对大量的数据(doc)进行修改,与删除一样,这是官方极度不推荐的。当然,按照一定的查询条件更新某些doc也是可以实现的。如果你和我一样,遇到了比较极端的情形或是一个强迫症患者。请组合以上两个操作,写一个比较复杂的query执行删除操作,然后把新的数据(doc)插入到对应的索引和类型中。

插入操作

  • 插入操作是ES的最基本操作,ES提供了最基本的插入功能,ES入库时需要批量的插入操作。举个简单的插入操作例子:
es = ES.connect_host()
es.index(index=data_index, doc_type="xxxx", body=data, request_timeout=10000)
  • 其中,index表示索引,doc_type表示数据类型,body表示具体的doc数据,最后一个参数表示超时时间。如果是日志文件或其它记录内容,建议index设置为时间或时间的组合体,如log_2015_11_29。数据类型即当前索引下数据的分类名称,可以把当前的数据按照不同的类型分类,同时也方便了查询,查询时可以很方便的过滤需要的类型。

相关参考

之前时间比较闲,翻译了部分与Python相关的ElasticSearch文档,如有疑问,欢迎回复评论,相互讨论学习。

elasticsearch的python增删查改实例分析的更多相关文章

  1. backbonejs mvc框架的增删查改实例

    一:开发环境 coffeescript和nodejs需要先安装,没装网上自己查安装步骤. 代码编写环境及esp框架下载: esp框架下载地址:https://github.com/nonocast/e ...

  2. SSH2 增删查改实例

    (一)引入包 (共73个,不一定都需要,但是我的项目是这么多,经过调试,没有包冲突) (二)创建数据库表 建立数据库octtest,并创建user表,表里面一共4个字段:id,姓,名,年龄. 语句如下 ...

  3. Elasticsearch使用系列-ES增删查改基本操作+ik分词

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 一.安装可视化工具Kibana ES是一个NoSql数据库应用.和其他数据库 ...

  4. Python对MySQL进行增删查改

    python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...

  5. jdbc的实例应用:增删查改实现

    //在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...

  6. hibernate基础增删查改简单实例

    hibernate 基础理论知识网上很多,可以百度和google.这里不做多的介绍,以一个User表来开展例子 建一个web-project 我这里用了junit单元测试环境来进行增删查改的测试,别的 ...

  7. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  8. VS 自动创建带增删查改的MVC网站

    VS 自动创建带增删查改的MVC网站 MVC.Net教程   废话放在前头,说一下这个文章的缘起某天某妹纸找我,说这个MVC的创建不太会,要记一下controllers.models.还有页面引用的东 ...

  9. Django笔记&教程 5-1 基础增删查改

    Django 自学笔记兼学习教程第5章第1节--基础增删查改 点击查看教程总目录 第四章介绍了模型类models.Model和创建模型,相当于介绍了数据库表和如何创建数据库表. 这一章将介绍如何使用模 ...

随机推荐

  1. 赵雅智_android多线程下载带进度条

    progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度. 一个进度条也可不确定其进度.在不确定模式下, ...

  2. HashTable、List、ArrayList的经典使用和相互转换

    1.添加引用 using System.Collections; 2.创建并添加数据 Hashtable hs = new Hashtable(); hs.Add("Name1", ...

  3. 【转】排名前十位的Linux发行版介绍

    Linux Distributions众多,据说有350个之多.distrowatch.com网站评出了排名前十位的Linux发行版.它们是:1.Ubuntu,当前最新版本是10.10:2.Fedor ...

  4. HDUOJ---2152

    Fruit Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. JavaScript 设计模式之代理模式

    一.代理模式概念解读 1.代理模式概念文字解读 代理,顾名思义就是帮助别人做事,GOF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问.代理模式使得代理对象 ...

  6. sudo: Cannot execute /usr/local/bin/zsh: No such file or directory 问题

    参考:sudo: Cannot execute /usr/local/bin/zsh: No such file or directory 之前在美化Ubuntu的时候,下了个zsh,但是忘记改配置文 ...

  7. Fusion Tables 图层用于呈现 Google Fusion Tables 中包含的数据

    Google Maps API 允许您使用 FusionTablesLayer 对象将 Google Fusion Tables 中包含的数据呈现为地图上的图层.Google Fusion Table ...

  8. python学习笔记——mongodb数据库

    1 概述 1.1 文件管理阶段 优点:可以长期保存 能存储大量数据 缺点:没有结构化的组织 查找不方便 数据容易冗余 1.2 数据库管理阶段 有文件存储的优点,同时解决了文件存储的问题 缺点 : 操作 ...

  9. Android开发之线性布局详解(布局权重)

    布局权重 线性布局支持给个别的子视图设定权重,通过android:layout_weight属性.就一个视图在屏幕上占多大的空间而言,这个属性给其设 定了一个重要的值.一个大的权重值,允许它扩大到填充 ...

  10. tomcat支持https的历程

    tomcat真是业界良心啊,文档写的详细无比. 一.https是什么? 简单的说,就是http+SSL/TLS 协议还是http,但是在传输层过程中使用了加密(涉及握手.秘钥分发.加密.解密等过程). ...