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使用MD5加密字符串示例
Aug 22 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
python中sys.argv函数精简概括
Jul 08 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
tensorflow常用函数API介绍
Apr 19 Python
python函数map()和partial()的知识点总结
May 26 Python
python实现马丁策略的实例详解
Jan 15 Python
如何用Python进行时间序列分解和预测
Mar 01 Python
Python中的pprint模块
Nov 27 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程序员的技术瓶颈分析
2011/07/17 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
php 定义404页面的实现代码
2012/11/19 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
JS高级运动实例分析
2016/12/20 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
python判断链表是否有环的实例代码
2020/01/31 Python
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
外语系毕业生自荐信范文
2013/12/16 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
食品工程专业求职信
2014/06/15 职场文书
放飞理想演讲稿
2014/09/09 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
人大代表选举标语
2014/10/07 职场文书
Python实现抖音热搜定时爬取功能
2022/03/16 Python
Nginx速查手册及常见问题
2022/04/07 Servers