elasticsearch使用记录

参考文章:https://elasticsearch-py.readthedocs.io/en/v8.8.2/
参考文章:https://cuiqingcai.com/6214.html
参考文章:https://www.cnblogs.com/cupleo/p/13953890.html
elasticsearch版本:8.8.2(软件包发行版)
python版本:3.10

目录

      • 导入包
      • 测试是否连接成功
      • 测试数据
      • 创建删除index
      • 插入数据
      • 查询数据
        • 模糊搜索
        • 精确搜索-使用keyword索引
        • 精确搜索-多个词语
        • 精确搜索-非中文可以直接使用
        • 精确搜索-多列匹配
        • id查询
      • 更新数据
      • 删除数据
      • 简易封装

导入包

from elasticsearch import Elasticsearch

es = Elasticsearch(hosts=["https://192.168.1.1:9200"],
                   basic_auth=['elastic', '123456'],
                   verify_certs=False)

测试是否连接成功

>>> es.ping()
True
>>> es.info()
{ 'name' : 'qhdata-dev',
'cluster_name' : 'elasticsearch',
'cluster_uuid' : 'un55kUpqQ9iFGEfp5UUQ5g',
'version' : { 'number' : '8.8.2',
'build_flavor' : 'default',
'build_type' : 'deb',
'build_hash' : '98e1271edf932a480e4262a471281f1ee295ce6b',
'build_date' : '2023-06-26T05:16:16.196344851Z',
'build_snapshot' : FALSE,
'lucene_version' : '9.6.0',
'minimum_wire_compatibility_version' : '7.17.0',
'minimum_index_compatibility_version' : '7.0.0' },
'tagline' : 'You Know, for Search' }

测试数据

doc = [
{
    'org_id': 'qh0000016598985',
    'org_name': '山东京博石油化工有限公司',  # 精确搜索使用的字段
    'org_code': '167154095',
    'org_usc_code': '913716251671540959'
},
{
    'org_id': 'qh0000017998348',
    'org_name': '山东天宏新能源化工有限公司',  # 精确搜索使用的字段
    'org_code': '670528461',
    'org_usc_code': '913716256705284610'
},
{
    'org_id': 'qh0000017996506',
    'org_name': '山东昆仑京博能源有限公司',  # 精确搜索使用的字段
    'org_code': '577790166',
    'org_usc_code': '913716255777901660'
},
{
    'org_id': 'qh0000018265983',
    'org_name': '诺力昂化学品(博兴)有限公司',  # 精确搜索使用的字段
    'org_code': '720705287',
    'org_usc_code': '913716007207052873'
},
]

创建删除index

es_index = 'test_org_id'
es.indices.delete(index=es_index, ignore=[400, 404])  # 删除 Index
es.indices.create(index=es_index, ignore=400)  # 创建 Index
es.indices.refresh()
# https://discuss.elastic.co/t/failed-to-parse-value-analyzed-as-only-true-or-false-are-allowed-es-upgrade-5-5-6-5/166473/2
mapping = {
    'properties': {
        'org_name': {
            'type': 'text',
            'analyzer': 'ik_max_word',  # 模糊搜索分析器
            'search_analyzer': 'ik_max_word',
            "fields": {
                "keyword": {
                    "type": "keyword",  # 相当于额外一重索引,类型为keyword,为精确搜索
                    "ignore_above": 256  # 最多256个字符
                }
            }
        },
        'org_id': {
            'type': 'keyword',  # 强行锁定仅进行精确搜索
        },
    }
}
es.indices.put_mapping(index=es_index, body=mapping)

创建好的效果
在这里插入图片描述

插入数据

for i in doc:
    es.index(index=es_index, document=i)  # 自动随机生成唯一id,或者指定id

插入好的效果
在这里插入图片描述
在这里插入图片描述

查询数据

参考文章:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html

模糊搜索

>>> es.search(index=es_index, query={"match": {'org_name': '山东'}}) # 模糊搜索
ObjectApiResponse ({ 'took' : 1,
	'timed_out' : FALSE,
	'_shards' : { 'total' : 1, 'successful' : 1, 'skipped' : 0, 'failed' : 0 },
	'hits' : { 'total' : { 'value' : 3, 'relation' : 'eq' },
	'max_score' : 0.37365946,
	'hits' : [{ '_index' : 'test_org_id',
	'_id' : 'CWGOhYkBHWntshc80OFi',
	'_score' : 0.37365946,
	'_source' : { 'org_id' : 'qh0000017996506', 'org_name' : '山东昆仑京博能源有限公司', 'org_code' : '577790166', 'org_usc_code' : '913716255777901660' }},
	{ '_index' : 'test_org_id',
	'_id' : 'B2GOhYkBHWntshc80OEs',
	'_score' : 0.35667494,
	'_source' : { 'org_id' : 'qh0000016598985', 'org_name' : '山东京博石油化工有限公司', 'org_code' : '167154095', 'org_usc_code' : '913716251671540959' }},
	{ '_index' : 'test_org_id',
	'_id' : 'CGGOhYkBHWntshc80OFc',
'_score' : 0.35667494,
'_source' : { 'org_id' : 'qh0000017998348', 'org_name' : '山东天宏新能源化工有限公司', 'org_code' : '670528461', 'org_usc_code' : '913716256705284610' }}]}})

精确搜索-使用keyword索引

>>> es.search(index=es_index, query={"term": {'org_name.keyword': '山东昆仑京博能源有限公司'}})  # 精确搜索-使用keyword索引
ObjectApiResponse ({ 'took' : 1,
	'timed_out' : FALSE,
	'_shards' : { 'total' : 1, 'successful' : 1, 'skipped' : 0, 'failed' : 0 },
	'hits' : { 'total' : { 'value' : 1, 'relation' : 'eq' },
	'max_score' : 1.2039728,
	'hits' : [{ '_index' : 'test_org_id',
	'_id' : 'CWGOhYkBHWntshc80OFi',
'_score' : 1.2039728,
'_source' : { 'org_id' : 'qh0000017996506', 'org_name' : '山东昆仑京博能源有限公司', 'org_code' : '577790166', 'org_usc_code' : '913716255777901660' }}]}})

精确搜索-多个词语

>>> es.search(index=es_index, query={"terms": {'org_name.keyword': ['山东昆仑京博能源有限公司', '山东京博石油化工有限公司']}})   # 精确搜索-多个词语
ObjectApiResponse ({ 'took' : 1,
	'timed_out' : FALSE,
	'_shards' : { 'total' : 1, 'successful' : 1, 'skipped' : 0, 'failed' : 0 },
	'hits' : { 'total' : { 'value' : 2, 'relation' : 'eq' },
	'max_score' : 1.0,
	'hits' : [{ '_index' : 'test_org_id',
	'_id' : 'B2GOhYkBHWntshc80OEs',
	'_score' : 1.0,
	'_source' : { 'org_id' : 'qh0000016598985', 'org_name' : '山东京博石油化工有限公司', 'org_code' : '167154095', 'org_usc_code' : '913716251671540959' }},
	{ '_index' : 'test_org_id',
	'_id' : 'CWGOhYkBHWntshc80OFi',
'_score' : 1.0,
'_source' : { 'org_id' : 'qh0000017996506', 'org_name' : '山东昆仑京博能源有限公司', 'org_code' : '577790166', 'org_usc_code' : '913716255777901660' }}]}})

精确搜索-非中文可以直接使用

>>> es.search(index=es_index, query={"term": {'org_code': '670528461'}})  # 精确搜索-非中文可以直接使用
ObjectApiResponse ({ 'took' : 1,
	'timed_out' : FALSE,
	'_shards' : { 'total' : 1, 'successful' : 1, 'skipped' : 0, 'failed' : 0 },
	'hits' : { 'total' : { 'value' : 1, 'relation' : 'eq' },
	'max_score' : 1.2039728,
	'hits' : [{ '_index' : 'test_org_id',
	'_id' : 'CGGOhYkBHWntshc80OFc',
'_score' : 1.2039728,
'_source' : { 'org_id' : 'qh0000017998348', 'org_name' : '山东天宏新能源化工有限公司', 'org_code' : '670528461', 'org_usc_code' : '913716256705284610' }}]}})

精确搜索-多列匹配

参考文章:https://stackoverflow.com/questions/43633472/how-to-simulate-multiple-fields-in-a-terms-query

>>> a = es.search(index=es_index, query={"bool":{
        'must':[
            {"term": {'org_code': '577790166'}},
            {"term": {'org_name.keyword': '山东昆仑京博能源有限公司'}}
        ]
        }})  # 关系should是or的意思,must是and的意思
>>> a = es.search(index=es_index, query={"bool":{
        'should':[
            {"term": {'org_code': '577790166'}},
            {"terms": {'org_name.keyword': ['山东昆仑京博能源有限公司', '山东京博石油化工有限公司']}}
        ]
        }})  # 关系should是or的意思,must是and的意思

id查询

>>> es.get(index=es_index, id='CGGOhYkBHWntshc80OFc', ignore=[404])  # id查询
ObjectApiResponse ({ '_index' : 'test_org_id',
	'_id' : 'CGGOhYkBHWntshc80OFc',
	'_version' : 1,
	'_seq_no' : 1,
	'_primary_term' : 1,
'found' : TRUE,
'_source' : { 'org_id' : 'qh0000017998348', 'org_name' : '山东天宏新能源化工有限公司', 'org_code' : '670528461', 'org_usc_code' : '913716256705284610' }})
>>> es.mget(index=es_index, ids=['CGGOhYkBHWntshc80OFc','CWGOhYkBHWntshc80OFi',] , ignore=[404])
ObjectApiResponse ({ 'docs' : [{ '_index' : 'test_org_id',
	'_id' : 'CGGOhYkBHWntshc80OFc',
	'_version' : 1,
	'_seq_no' : 1,
	'_primary_term' : 1,
	'found' : TRUE,
	'_source' : { 'org_id' : 'qh0000017998348', 'org_name' : '山东天宏新能源化工有限公司', 'org_code' : '670528461', 'org_usc_code' : '913716256705284610' }},
	{ '_index' : 'test_org_id',
	'_id' : 'CWGOhYkBHWntshc80OFi',
	'_version' : 1,
	'_seq_no' : 2,
	'_primary_term' : 1,
'found' : TRUE,
'_source' : { 'org_id' : 'qh0000017996506', 'org_name' : '山东昆仑京博能源有限公司', 'org_code' : '577790166', 'org_usc_code' : '913716255777901660' }}]})

更新数据

tmp_doc = {
    'org_id': 'qh0000016598985',
    'org_name': '山东京博石油化工有限公司',  # 精确搜索使用的字段
    'org_code': '167154095',
    'org_usc_code': '913716251671540959'
}
es.update(index=es_index, id='_WFwd4kBHWntshc80-AY', doc=tmp_doc)
tmp_doc = {
    "script": {  # 更新内容
        "source": "ctx._source['org_code']='123123123123'",
        "lang": "painless"
    },
    "query": {  # 查询匹配
        "term": {
            "org_name.keyword": "山东天宏新能源化工有限公司"
        }
    }
}
es.update_by_query(index=es_index, body=tmp_doc)

删除数据

es.delete(index=es_index, id='_WFwd4kBHWntshc80-AY', ignore=[404])
es.delete_by_query(index=es_index, query={"term": {'org_name.keyword': '山东昆仑京博能源有限公司'}})

ps:这里的删除,是指直接把数据标记为待删除,等系统后续从index中删除。

简易封装

from elasticsearch import Elasticsearch
import time
import re

class ConnectElasticSearch(object):
    def __init__(self, **kwargs):
        self.hosts = kwargs.get("hosts", ["https://192.168.1.1:9200"])
        self.basic_auth = kwargs.get("basic_auth", ['elastic', '123456'])
        self.conn = Elasticsearch(hosts=self.hosts,
                   basic_auth=self.basic_auth,
                   verify_certs=False,
                   retry_on_timeout=True)

    def cleanSearchResult(self, source, item:str = 'origin'):
        '''
        清理/解析查询回来的数据
        :param source: 查询的结果
        :param item: 需要的内容
        :return:
        '''
        assert item in ['origin', 'raw', 'max_score', 'max_score_source', '_source', '_id', '_index', '_score']
        hits = source.body['hits']
        max_score = hits['max_score']
        raw = hits['hits']
        if item == 'origin':
            return hits
        if item == 'raw':
            return raw
        if item == 'max_score':
            return [i for i in raw if i['_score'] == max_score]
        if item == 'max_score_source':
            return [i['_source'] for i in raw if i['_score'] == max_score]
        if item == '_source':
            return [i['_source'] for i in raw]
        if item == '_id':
            return [i['_id'] for i in raw]
        if item == '_index':
            return [i['_index'] for i in raw]
        if item == '_score':
            return [i['_score'] for i in raw]

    def insert(self, index: str, source: pd.DataFrame) -> None:
        '''
        插入数据,模仿sql中的[insert]逻辑
        :param index: str,索引
        :param source: DataFrame,待入库数据
        :return: None
        '''
        source = source.to_dict(orient='records')
        for i in source:
            self.conn.index(index=index, document=i)

    def ignore(self, index: str, source: pd.DataFrame, primary_key: list[str]):
         '''
        插入数据,模仿sql中的[insert ignore]逻辑,当有相同主键数据时后忽略不插入
        :param index: str,索引
        :param source: DataFrame,待入库数据
        :param primary_key: list[str],主键所在列名
        :return: None
        '''
        source = source.to_dict(orient='records')
        for i in source:
            query = {'bool': {'must': []}}
            for pk in primary_key:
                tmp = re.sub('\.keyword$', '', pk)
                query['bool']['must'].append({"term": {pk: i.get(tmp)}})
            tmp = self.conn.search(index=index, query=query)
            raw = self.cleanSearchResult(tmp, 'raw')
            if raw == []:  # es中没有该条数据
                self.conn.index(index=index, document=i)

    def update(self, index: str, source: pd.DataFrame, primary_key: list[str]):
         '''
        插入数据,模仿sql中的[insert into on duplicate key update]逻辑,当有相同主键数据时后忽略不插入
        :param index: str,索引
        :param source: DataFrame,待入库数据
        :param primary_key: list[str],主键所在列名
        :return: None
        '''
        source = source.to_dict(orient='records')
        for i in source:
            query = {'bool': {'must': []}}
            for pk in primary_key:
                tmp = re.sub('\.keyword$', '', pk)
                query['bool']['must'].append({"term": {pk: i.get(tmp)}})
            tmp = self.conn.search(index=index, query=query)
            id = self.cleanSearchResult(tmp, '_id')
            if id == []:  # es中没有该条数据
                self.conn.index(index=index, document=i)
            else:
                for k in id:
                    self.conn.update(index=index, id=k, doc=i)

    def only_update(self, index: str, source: pd.DataFrame, primary_key: list[str]):
         '''
        插入数据,模仿sql中的[update]逻辑,当有相同主键数据时后忽略不插入
        :param index: str,索引
        :param source: DataFrame,待入库数据
        :param primary_key: list[str],主键所在列名
        :return: None
        '''
        source = source.to_dict(orient='records')
        for i in source:
            query = {'bool': {'must': []}}
            for pk in primary_key:
                tmp = re.sub('\.keyword$', '', pk)
                query['bool']['must'].append({"term": {pk: i.get(tmp)}})
            tmp = self.conn.search(index=index, query=query)
            id = self.cleanSearchResult(tmp, '_id')
            if id == []:  # es中没有该条数据
                continue
            else:
                for k in id:
                    self.conn.update(index=index, id=k, doc=i)

    def delete(self, index: str, source: pd.DataFrame, primary_key: list[str]):
         '''
        插入数据,模仿sql中的[delete]逻辑,当有相同主键数据时后忽略不插入
        :param index: str,索引
        :param source: DataFrame,待入库数据
        :param primary_key: list[str],主键所在列名
        :return: None
        '''
        source = source.to_dict(orient='records')
        for i in source:
            query = {'bool': {'must': []}}
            for pk in primary_key:
                tmp = re.sub('\.keyword$', '', pk)
                query['bool']['must'].append({"term": {pk: i.get(tmp)}})
            self.conn.delete_by_query(index=index, query=query)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/47176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 读写分离

目录 一、什么是读写分离? 二、为什么要读写分离呢? 三、什么时候要读写分离? 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1)基于程序代码内部实现 2)基于中间代理层实现…

React重新渲染的触发机制及其优化策略

React是一个用于构建用户界面的JavaScript库,它的核心特点之一是使用虚拟DOM(Virtual DOM)来实现高效的组件渲染。那组件重新渲染的机制是如何呢?基于这些机制,如果进行优化呢? 虚拟DOM是一个用JavaScript对…

"科技与狠活"企业级无代码开发MES系统,一周实现数字化

随着科技的不断发展,企业级无代码开发平台成为了一种新型的解决方案,能够有效降低软件开发门槛,提升开发效率。在制造业领域,MES系统(Manufacturing Execution System)作为一种关键的生产管理工具&#xff…

C# 全局响应Ctrl+Alt+鼠标右键

一、简述 某些应用,我们希望全局自定义热键。按键少了会和别的应用程序冲突,按键多了可定用户操作不变。因此我计划左手用CtrlAlt,右手用鼠标右键呼出我自定义的菜单。 我使用键盘和鼠标事件进行简单测试(Ctrl鼠标右键&#xff…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务,锁,子查询 事务有点像是原子操作,需要有完整性,要么全都完成了&#xff…

2023年深圳杯数学建模A题影响城市居民身体健康的因素分析

2023年深圳杯数学建模 A题 影响城市居民身体健康的因素分析 原题再现: 以心脑血管疾病、糖尿病、恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病(以下简称慢性病)已经成为影响我国居民身体健康的重要问题。随着人们生活方式的改变&am…

flutter开发实战-RepaintBoundary实现Widget截图功能

flutter开发实战-RepaintBoundary实现Widget截图功能 在开发中,遇到需要使用截图,像iOS可以截图UIView获取到UIImage,在flutter中可以使用RepaintBoundary实现截图功能 相机拍摄的图片: RepaintBoundary截图后的图片 一、Re…

Docker 全栈体系(七)

Docker 体系(高级篇) 五、Docker-compose容器编排 1. 是什么 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调…

python selenium爬虫自动登录实例

拷贝地址:python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库,使用pip install selenium 命令安装,selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…

测试技术之测试用例质量的评估

第一,凭证测试用例的方式评估其品质,主要搜罗: 1)测试用例与需要规格剖析中需要条款的可追溯性,好比:咱们要求每一个需要条款至少有1个测试用例与之对于应。目的是为了评估测试的需要拆穿困绕率,以及合成需…

抖音seo源码开发源代码开发技术分享

一、 抖音SEO源码开发,需要掌握以下技术: 抖音API接口:抖音提供了丰富的API接口,包括用户信息、视频信息、评论信息等。 数据爬取技术:通过抓包分析抖音接口的数据结构,可以使用Python等编程语言编写爬虫程…

【低代码专题方案】iPaaS运维方案,助力企业集成平台智能化高效运维

01 场景背景 随着IT行业的发展和各家企业IT建设的需要,信息系统移动化、社交化、大数据、系统互联、数据打通等需求不断增多,企业集成平台占据各个企业领域,成为各业务系统数据传输的中枢。 集成平台承接的业务系统越多,集成平台…

Practice1|1207. 独一无二的出现次数、1365. 有多少小于当前数字的数字、941. 有效的山脉数组

1207. 独一无二的出现次数 1.题目: 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 示例 1: 输入:arr [1,2,2,1,1,3…

FPGA-DFPGL22学习7-gpio

系列文章目录 FPGA-DFPGL22学习6-led 文章目录 系列文章目录前言一、原理图1)key2)beeptouch端口对应1)key2)beeptouch 二、程序设计1)KEY2)beeptouch 三、程序编写1.KEY代码:2.beeptouch代码: 结论 前言 和原子哥一起学习FPGA …

JAVA面试总结-Redis篇章(四)——双写一致性

JAVA面试总结-Redis篇章(四)——双写一致性 问:redis 做为缓存,mysql的数据如何与redis进行同步呢?第一种情况,如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存,再修改数据库&…

「深度学习之优化算法」(十八)头脑风暴算法

1. 头脑风暴算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   可能大家对“头脑风暴”这个词不怎么熟,毕竟是外来词汇,其大概含义就是分组讨论,畅所欲言。   头脑风暴算法(Brain Storm Optimization)是根据人们进行“头脑风暴”讨论困难问题的解决方案的过…

Spring数据源

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:JavaEE、Spring 目录 1、简介2、作用3、开发步骤3.1、导入坐标3.2、创建对象c3p0druid提取jdbc.properties读取配…

【Git】

学习来自于: 女朋友乱用Git,差点把我代码删了。。。 一些常用的Git 知识点整理 关于Git这一篇就够了 Git基本命令大全 30分钟精通Git,学不会来找我 Git 版本管理 | 莫烦PYTHON Git 代码版本管理教程 文章目录 【前言】集中式与分布式的…

【微服务系统设计】系统设计基础:速率限制器

什么是速率限制器? 速率限制是指防止操作的频率超过定义的限制。在大型系统中,速率限制通常用于保护底层服务和资源。速率限制一般在分布式系统中作为一种防御机制,使共享资源能够保持可用性。 速率限制通过限制在给定时间段内可以到达您的 A…

分布式光伏并网防孤岛保护装置AM5SE-IS

分布式光伏并网防孤岛保护装置AM5SE-IS 应用场景 防孤岛原理:防孤岛保护装置检测到并网点有逆功率、频率突变、 等异常数据时,即发生孤岛现象时,装置可配合断路器快速切除并网点,使本站与电网侧快速脱离,保证整个电站…