python操作ElasticSearch-创建、插入、检索_机智翔学长的博客-程序员宝宝

技术标签: python  ElasticSearch  数据库  

1. 介绍ES

引用:Elasticsearch入门(一):elasticsearc基础概念

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Elasticsearch 权威指南(中文版)

1, Kibana可视化分析,可以插入,查询等。
2, 用python,java等 调用es的相应接口。这里主要用python。

2. 安装ES与打开

2.1 安装

可以参考 安装es教程
记得安装中文分词器。

2.2 打开

在这里插入图片描述
打开es服务器后,输入网址:
http://localhost:9200/ 检查es是否安装正确
在这里插入图片描述
打开成功。

3. 创建索引

相当于建数据库的表,和定义字段。

#####################创建索引####################################
from elasticsearch import Elasticsearch

es = Elasticsearch()

def deleteInices(my_index):
    if True and es.indices.exists(my_index):  #确认删除再改为True
        print("删除之前存在的")
        es.indices.delete(index=my_index)
    
def createIndex(my_index, my_doc):
    # index settings
    settings = \
    {
    
    "mappings": {
    
            my_doc :{
    
            "properties": {
    
                "my_id":{
    "type": "integer"},
                "my_word": {
    "type": "text","analyzer": "ik_smart","search_analyzer": "ik_smart"}
            }
        }
    }
    }
    # create index
    es.indices.create(index=my_index, ignore=400, body=settings)
    print("创建index成功!")

def mainCreateIndex():
    # 调用后创建index
    my_index = "word2vec_index"
    my_doc = "my_doc"
    deleteInices(my_index)
    createIndex(my_index, my_doc)

4. 插入数据

这里以bulk形式批量插入数据。

#####################插入数据####################################

from tqdm import tqdm #进度条
from elasticsearch import helpers

def getAllWords(path="vocab.txt"):
    #将数据从文件读出
    #文件格式:
    #
    words = []
    with open(path, "r", encoding="utf-8") as f:
        for i,item in enumerate(f.readlines()):
            words.append((i,item.strip()))
    return words

def insertData(words, my_index, my_doc, one_bulk):
    #插入数据
    #one_bulk表示一个bulk里装多少个
    body = []
    body_count = 0  #记录body里面有多少个. 
    #最后一个bulk可能没满one_bulk,但也要插入

    print("共需要插入%d条..."%len(words))
    pbar = tqdm(total=len(words))

    for id,word in words:
        data1 = {
     "my_id": id,
                  "my_word": word}
        every_body = \
        {
    
            "_index": my_index,
            "_type": my_doc,
            "_source": data1
        }

        if body_count<one_bulk:
            body.append(every_body)
            body_count+=1
        else:
            helpers.bulk(es, body) #还是要用bulk啊,不然太慢了
            pbar.update(one_bulk)
            body_count = 0
            body = []
            body.append(every_body)
            body_count+=1

    if len(body)>0:
        #如果body里面还有,则再插入一次(最后非整块的)
        helpers.bulk(es, body)
        # pbar.update(len(body))
        print('done2')

    pbar.close()
    #res = es.index(index=my_index,doc_type=my_doc,id=my_key_id,body=data1)  #一条插入
    print("插入数据完成!")

def mainInsert():
    # 调用后插入数据
    my_index = "word2vec_index"
    my_doc = "my_doc"
    words = getAllWords(path="vocab.txt")
    insertData(words, my_index, my_doc, one_bulk=5000)

5. 检索数据

5.1 代码

#####################检索数据####################################

def keywordSearch(keywords1, my_index, my_doc):
    #根据keywords1来查找,倒排索引
    my_search1 = \
        {
    
            "query" : {
    
                "match" : {
    
                    "my_word" : keywords1
                }
            }
        }
    #直接查询
    # res= es.search(index=my_index,body=my_search1)
    # total = res["hits"]["total"] #一共这么多个
    # print("共查询到%d条数据"%total)

    #helpers查询
    es_result = helpers.scan(
        client=es,
        query=my_search1,
        scroll='10m',
        index=my_index,
        timeout='10m'
    )
    es_result = [item for item in es_result] #原始是生成器<generator object scan at 0x0000022E384697D8>
    # print(es_result) #你可以直接打印查看
    search_res = []
    for item in es_result:
        tmp = item['_source']
        search_res.append((tmp['my_id'], tmp['my_word']))
    print("共查询到%d条数据"%len(es_result))
    print(search_res)
    
def mainSearch():
    # 调用后检索数据
    my_index = "word2vec_index"
    my_doc = "my_doc"
    keywords1 = "氨基酸"
    keywordSearch(keywords1, my_index, my_doc)

5.2 结果

在这里插入图片描述

6. 下载

包括完整代码,原始txt数据,我总结的es常用命令。
点击 python操作ElasticSearch 下载。

7. 其他资料

1, windows 中 elasticsearch启动报错ERROR: [1] bootstrap checks failed
2, ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询数据-java
3, 如何快速搭建出来自己的搜索系统
4, Elasticsearch(八)elasticsearch数据输入和输出
5, python 操作ES
6, Elasticsearch增、删、改、查操作深入详解
7, 深入详解Elasticsearch
8, Elasticsearch 权威指南(中文版)

结尾:
整个过程,我花了不少时间总结,并且自己创造了一些代码,若有帮助,还请点个赞多多支持。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/GreatXiang888/article/details/103829973

智能推荐

python代码写不出来怎么办_有多少人看得懂Python代码,却连一个猜数字游戏都单独写不出来!..._weixin_39757169的博客-程序员宝宝

做个实验,我相信基本所有人都看得懂一些Python代码,看着别人写出来的逻辑思维也能够理解,但是要自己去用pycharm编辑的收获就懵逼了,不知道从哪里动手。不瞒你们说,我自己以前就是那样的。那么我下面给出思路,你可以直接自己动手写代码,也可以看看我的代码然后自己再写一遍,看你是否如你心中所想,这简单到没资格让你动手。。。我竟然没写出来在这里还是要推荐下我自己建的Python开发学习裙:304 ...

buildroot编译树莓派0-led控制程序[email protected]的博客-程序员宝宝_buildroot 树莓派

树莓派0 板载唯一的ATC led,是状态指示灯,本节利用c语言控制led!查看设备树buildroot 树莓派0默认配置,选择的设备树文件为:bcm2708-rpi-zero.dts其中led 为GPIO 47,默认触发方式为mmc0,即SD卡读写状态指示灯。&amp;leds { act_led: act { label = "led0"; linux,default...

汇编语言 实验二_渣渣的夏天的博客-程序员宝宝_汇编语言第三版实验二

一、实验目的  掌握汇编编程规范,熟悉编程环境。二、实验内容  编程:参考教材实验9,在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串’welcome to masm’。三、实验步骤算法及关键代码1.1 算法步骤  ① 设置目的地址、源地址起始位置,方便后续读写数据;  ② 从源地址读取第一个字符;  ③ 输入到屏幕显示区的第一二三行的中央,改变每行字符的属性;  ④ 读取下一...

用实例分析H264 RTP payload _ExperiencesOfCode的博客-程序员宝宝

H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved)应用程序可以使用第一个字节来识别。在SDP中也说明了本次会话的属性SDP 参数下面描述了如何在 SDP 中表示一个 H.264 流:. "m=" 行中的媒体名必须是 "video". "a=rtpmap" 行中的编码名称必须是 "H264".. "a=rtpmap" 行中的时钟频率必须是 90000.. 其他参数都包括在 "a=fmtp" 行中.如:m=video 4

随便推点

Jest 学习04 - DOM 测试、快照测试、测试覆盖率_皮蛋很白的博客-程序员宝宝_jest 测试dom

DOM 测试官方文档:DOM Manipulation直接操作 DOM 的代码通常被认为难以测试,因为操作 DOM 就要使用浏览器环境的 DOM Api,而 Jest 是运行在 Node 环境中的。例如:// 操作 DOM 的函数function renderHtml() { const div = document.createElement('div') div.innerHTML = ` &lt;h1&gt;Hello World&lt;/h1&gt; ` doc

程序员的杂想-不要只做一名程序员_zengxiaobai的博客-程序员宝宝

从一次进食堂吃饭感想:食堂运营模式一般有两种:多个窗口,每个窗口有一位负责打菜 结账;流水线;到底哪种方式更好呢?作为程序员,首先想到的是吞吐量:怎么算呢?是以单位出队人次 还是以 工作人员单位处理工作 的角度来看呢?想来想去 想不出个所以然。定量分析实在是短板。那么我们就根据具体特征和一个动态过程进行定性分析吧偶然想到,流水线的好处 是 缓存中的人数多,大家都有的选,而 你一看到集...

python MySQLdb学习笔记_佣工7001的博客-程序员宝宝

MySQLdb库是Python访问MySql的连接库,最近项目中需要使用,将学习使用所得整理如下。由于我是windows环境,安装很简单,到这里下载一个.windows环境下载exe版本,直接双击安装很方便.MySQLdb windows下运行需要 libmySQL.dll、libmmd.dll 和 libguide40.dll ,可以放在sitepackage下也可以在windows

Java 重写(Override)与重载(Overload)_糖果可乐鸭的博客-程序员宝宝

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOExceptio

better-scroll的基本使用(笔记)_不是死水的博客-程序员宝宝

什么是better-scrollbetter-scroll是一款重点解决移动端各种滚动场景需求的插件。安装及使用在控制台输出npm install better-scroll --save使用

推荐文章

热门文章

相关标签