Python 操作 ElasticSearch的完整代码


Posted in Python onAugust 04, 2019

官方文档:https://elasticsearch-py.readthedocs.io/en/master/

1、介绍

python提供了操作ElasticSearch 接口,因此要用python来操作ElasticSearch,首先要安装python的ElasticSearch包,用命令pip install elasticsearch安装或下载安装:https://pypi.python.org/pypi/elasticsearch/5.4.0

  2、创建索引

假如创建索引名称为ott,类型为ott_type的索引,该索引中有五个字段:

title:存储中文标题,

date:存储日期格式(2017-09-08),

keyword:存储中文关键字,

source:存储中文来源,

link:存储链接,

创建映射:

Python 操作 ElasticSearch的完整代码

Python 操作 ElasticSearch的完整代码

3、索引数据

Python 操作 ElasticSearch的完整代码

批量索引

利用bulk批量索引数据

Python 操作 ElasticSearch的完整代码

  4、查询索引

Python 操作 ElasticSearch的完整代码 

5、删除数据

Python 操作 ElasticSearch的完整代码

6、完整代码

#coding:utf8
import os
import time
from os import walk
import CSVOP
from datetime import datetime
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
class ElasticObj:
  def __init__(self, index_name,index_type,ip ="127.0.0.1"):
    '''
    :param index_name: 索引名称
    :param index_type: 索引类型
    '''
    self.index_name =index_name
    self.index_type = index_type
    # 无用户名密码状态
    #self.es = Elasticsearch([ip])
    #用户名密码状态
    self.es = Elasticsearch([ip],http_auth=('elastic', 'password'),port=9200)
  def create_index(self,index_name="ott",index_type="ott_type"):
    '''
    创建索引,创建索引名称为ott,类型为ott_type的索引
    :param ex: Elasticsearch对象
    :return:
    '''
    #创建映射
    _index_mappings = {
      "mappings": {
        self.index_type: {
          "properties": {
            "title": {
              "type": "text",
              "index": True,
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            },
            "date": {
              "type": "text",
              "index": True
            },
            "keyword": {
              "type": "string",
              "index": "not_analyzed"
            },
            "source": {
              "type": "string",
              "index": "not_analyzed"
            },
            "link": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
    if self.es.indices.exists(index=self.index_name) is not True:
      res = self.es.indices.create(index=self.index_name, body=_index_mappings)
      print res
  def IndexData(self):
    es = Elasticsearch()
    csvdir = 'D:/work/ElasticSearch/exportExcels'
    filenamelist = []
    for (dirpath, dirnames, filenames) in walk(csvdir):
      filenamelist.extend(filenames)
      break
    total = 0
    for file in filenamelist:
      csvfile = csvdir + '/' + file
      self.Index_Data_FromCSV(csvfile,es)
      total += 1
      print total
      time.sleep(10)
  def Index_Data_FromCSV(self,csvfile):
    '''
    从CSV文件中读取数据,并存储到es中
    :param csvfile: csv文件,包括完整路径
    :return:
    '''
    list = CSVOP.ReadCSV(csvfile)
    index = 0
    doc = {}
    for item in list:
      if index > 1:#第一行是标题
        doc['title'] = item[0]
        doc['link'] = item[1]
        doc['date'] = item[2]
        doc['source'] = item[3]
        doc['keyword'] = item[4]
        res = self.es.index(index=self.index_name, doc_type=self.index_type, body=doc)
        print(res['created'])
      index += 1
      print index
  def Index_Data(self):
    '''
    数据存储到es
    :return:
    '''
    list = [
      {  "date": "2017-09-13",
        "source": "慧聪网",
        "link": "http://info.broadcast.hc360.com/2017/09/130859749974.shtml",
        "keyword": "电视",
        "title": "付费 电视 行业面临的转型和挑战"
       },
      {  "date": "2017-09-13",
        "source": "中国文明网",
        "link": "http://www.wenming.cn/xj_pd/yw/201709/t20170913_4421323.shtml",
        "keyword": "电视",
        "title": "电视 专题片《巡视利剑》广获好评:铁腕反腐凝聚党心民心"
       }
       ]
    for item in list:
      res = self.es.index(index=self.index_name, doc_type=self.index_type, body=item)
      print(res['created'])
  def bulk_Index_Data(self):
    '''
    用bulk将批量数据存储到es
    :return:
    '''
    list = [
      {"date": "2017-09-13",
       "source": "慧聪网",
       "link": "http://info.broadcast.hc360.com/2017/09/130859749974.shtml",
       "keyword": "电视",
       "title": "付费 电视 行业面临的转型和挑战"
       },
      {"date": "2017-09-13",
       "source": "中国文明网",
       "link": "http://www.wenming.cn/xj_pd/yw/201709/t20170913_4421323.shtml",
       "keyword": "电视",
       "title": "电视 专题片《巡视利剑》广获好评:铁腕反腐凝聚党心民心"
       },
      {"date": "2017-09-13",
       "source": "人民电视",
       "link": "http://tv.people.com.cn/BIG5/n1/2017/0913/c67816-29533981.html",
       "keyword": "电视",
       "title": "中国第21批赴刚果(金)维和部?启程--人民 电视 --人民网"
       },
      {"date": "2017-09-13",
       "source": "站长之家",
       "link": "http://www.chinaz.com/news/2017/0913/804263.shtml",
       "keyword": "电视",
       "title": "电视 盒子 哪个牌子好? 吐血奉献三大选购秘笈"
       }
    ]
    ACTIONS = []
    i = 1
    for line in list:
      action = {
        "_index": self.index_name,
        "_type": self.index_type,
        "_id": i, #_id 也可以默认生成,不赋值
        "_source": {
          "date": line['date'],
          "source": line['source'].decode('utf8'),
          "link": line['link'],
          "keyword": line['keyword'].decode('utf8'),
          "title": line['title'].decode('utf8')}
      }
      i += 1
      ACTIONS.append(action)
      # 批量处理
    success, _ = bulk(self.es, ACTIONS, index=self.index_name, raise_on_error=True)
    print('Performed %d actions' % success)
  def Delete_Index_Data(self,id):
    '''
    删除索引中的一条
    :param id:
    :return:
    '''
    res = self.es.delete(index=self.index_name, doc_type=self.index_type, id=id)
    print res
  def Get_Data_Id(self,id):
    res = self.es.get(index=self.index_name, doc_type=self.index_type,id=id)
    print(res['_source'])
    print '------------------------------------------------------------------'
    #
    # # 输出查询到的结果
    for hit in res['hits']['hits']:
      # print hit['_source']
      print hit['_source']['date'],hit['_source']['source'],hit['_source']['link'],hit['_source']['keyword'],hit['_source']['title']
  def Get_Data_By_Body(self):
    # doc = {'query': {'match_all': {}}}
    doc = {
      "query": {
        "match": {
          "keyword": "电视"
        }
      }
    }
    _searched = self.es.search(index=self.index_name, doc_type=self.index_type, body=doc)
    for hit in _searched['hits']['hits']:
      # print hit['_source']
      print hit['_source']['date'], hit['_source']['source'], hit['_source']['link'], hit['_source']['keyword'], \
      hit['_source']['title']

obj =ElasticObj("ott","ott_type",ip ="47.93.117.127")
# obj = ElasticObj("ott1", "ott_type1")
# obj.create_index()
obj.Index_Data()
# obj.bulk_Index_Data()
# obj.IndexData()
# obj.Delete_Index_Data(1)
# csvfile = 'D:/work/ElasticSearch/exportExcels/2017-08-31_info.csv'
# obj.Index_Data_FromCSV(csvfile)
# obj.GetData(es)

总结

以上所述是小编给大家介绍的Python 操作 ElasticSearch的完整代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python实现获取操作系统版本信息方法
Apr 08 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
Python基于property实现类的特性操作示例
Jun 15 Python
Python global全局变量函数详解
Sep 18 Python
把pandas转换int型为str型的方法
Jan 29 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
教你用Python爬取英雄联盟皮肤原画
Jun 13 Python
Python简易开发之制作计算器
Apr 28 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 #Python
elasticsearch python 查询的两种方法
Aug 04 #Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 #Python
Django 创建新App及其常用命令的实现方法
Aug 04 #Python
python模拟鼠标点击和键盘输入的操作
Aug 04 #Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 #Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 #Python
You might like
php ftp文件上传函数(基础版)
2010/06/03 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHP时间处理类操作示例
2018/09/05 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
2016/05/28 Python
python实现内存监控系统
2021/03/07 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
2014年个人债务授权委托书范本
2014/09/22 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
大学军训口号大全
2015/12/24 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript