elasticsearch使用记录

news2024/12/24 3:40:00

参考文章: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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据教材推荐-《Python数据分析与应用(第2版)(微课版)》

《Python数据分析与应用(第2版)(微课版)》 是“十四五”职业教育国家规划教材,也是大数据应用开发“1X”职业技能等级证书配套系列教材,以任务为导向,全面介绍数据分析的流程和应用,详细讲解利用Python解决企业实际问题的方法。内…

Object.hasOwn 低版本浏览器兼容性问题解决

使用 hasOwn 去测试属性是否存在 ,报错如下: 原因: hasOwn是es2022新语法,旧浏览器不支持。 解决方案: 使用Object.hasOwnProperty()代替。 Object.prototype.hasOwnProperty.call(obj, id)

1台相当于种20棵树!海尔冷媒变流空调获用户和社会双重满意

作者 | 曾响铃 文 | 响铃说 空调调到26度,风速调到2档,长按制冷键5秒......每年夏天,暑热来临,在抖音、小红书等社交平台上总能刷到类似的“开空调小技巧”。据说,按照这样来开空调,不仅可以实现凉而不冷…

-bash: /bin/rm: Argument list too long

有套数据库环境,.aud文件太多导致/u01分区使用率过高,rm清理时发现报错如下 [rootdb1 audit]# rm -rf ASM1_ora_*202*.aud -bash: /bin/rm: Argument list too long [rootdb1 audit]# rm -rf ASM1_ora_*20200*.aud -bash: /bin/rm: Argument list too…

Sui Move与标准Move的有哪些区别和根本性创新

Sui网络将Sui Move作为其本地编程语言,使用Sui Move编写的apps利用Sui的共识机制,实现了令人印象深刻的交易性能。 然而,熟悉Move编程语言的开发者在探索Sui文档时可能会感到困惑,因为该文档着重介绍了对象和一些指令&#xff0c…

使用TensorFlow训练深度学习模型实战(上)

大家好,尽管大多数关于神经网络的文章都强调数学,而TensorFlow文档则强调使用现成数据集进行快速实现,但将这些资源应用于真实世界数据集是很有挑战性的,很难将数学概念和现成数据集与我的具体用例联系起来。本文旨在提供一个实用…

自然语言处理应用程序设计

原文地址:https://zhanghan.xyz/posts/22426/ 文章目录 一、摘要二、数据集三、相关环境四、功能展示1.系统主界面2.中文分词3.命名实体识别4.文本分类5.文本聚类6.其他界面 五、源码链接 一、摘要 将自然语言处理课程设计中实现的模型集成到自然语言处理应用程序…

利用模 m 的原根存在性判断以及求解

完整资料进入【数字空间】查看——搜索"writebug" 一、题目: 模 m 的原根存在性判断以及求解。判断 m 原根是否存在,如存在给出一个原根以及所有原根。 二、问题描述 首先要判断给定模 m 是否存在原根,然后需要对其原根进行求解。…

js截取字符串

1、 split() 方法用于把一个 字符串 分割成 字符串数组 var str "123,456,789"; console.log(str.split()); // ["1", "2", "3", ",", "4", "5", "6", ",", "7", &…

性能测试—性能监控

性能监控 性能监控是指通过收集、分析和报告关键性能指标,实时监测系统、应用程序或网络的性能和健康状况。通过性能监控,您可以及时发现潜在的性能问题,识别系统瓶颈,并进行性能优化。 以下是一些常见的性能监控指标和技术&…

标准IO_打开和关闭文件_fopen,fdopen,freopen,stdin,stdout,stderr

目录 1.打开文件 1.1 fopen函数原型 1.1.1 fopen函数 1.1.2 fopen函数原理 1.1.3 文本文件和二进制文件区别? 1.1.4 “r"模式和“rb”模式区别? 1.1.5 fopen函数使用示例 1.2 fdopen函数原型 1.2.1 fdopen函数 1.2.2 fdopen函数原理 1.2…

电脑丢失msvcp140.dll的解决方法分享

如果你在使用电脑时遇到了“找不到msvcp140.dll”的错误提示,别着急!这并不是什么严重的问题,电脑丢失msvcp140.dll的解决方法分享,只要你按照以下方法进行处理,很快就能够顺利地解决它。 一.什么是msvcp140.dll msvc…

Spring Boot与MyBatis结合 实现对mock平台改造

上一章: 测开工具:spring boot 实现mock平台_springboot搭建mock_做测试的喵酱的博客-CSDN博客 代码地址: GitHub - 18713341733/mock: Spring Boot与MyBatis结合 实现对mock平台改造 一、背景 读取数据改为从mysql数据库中读取。 Sp…

RDIFramework.NET CS敏捷开发框架 V6.0发布(支持.NET6+、Framework双引擎,全网唯一)

全新RDIFramework.NET V6.0 CS敏捷开发框架发布,全网唯一支持.NET6,Framework双引擎,降低开发成本,提高产品质量,提升用户体验与开发团队稳定性,做软件就选RDIFramework.NET开发框架。 1、RDIFramework.NET…

主从复制高级进阶

从主库入手: 关闭 主:修改配置文件 /etc/my.cnf 查看日志 查看 从: 修改重启 重启后报错,可能是uuid相同,要修改 查看状态 都是yes 从 从库入手 修改配置文件重启 从3: 从2: 先停止slave …

redis中使用bloomfilter的白名单功能解决缓存预热问题

一 缓存预热 1.1 缓存预热 将需要的数据提前缓存到缓存redis中,可以在服务启动时候,或者在使用前一天完成数据的同步等操作。保证后续能够正常使用。 1.2 解决办法PostConstruct注解初始化

微服务框架入门

微服务 微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征: 单一职责:微服务拆分粒度小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发面向服务:微服务对外暴露…

闲置旧手机搭建服务器?在安卓手机上使用Termux搭建web服务「公网远程访问」

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许多基本操作,不需要root权限Termux就…

MobileViG实战:使用MobileViG实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译:https://blog.csdn.net/m0_47867638/article/details/131860981?spm1001.2014.3001.5502 官方源码:https://github.com/SLDGroup/M…

Qt Core学习日记——第四天QMetaEnum(下)

类定义&#xff1a; 成员变量就只有QMetaObject *mobj和uint handle&#xff0c;handle同样用于计算在qt_meta_stringdata_XTest的位置 成员函数&#xff1a; 接下以test类进行函数讲解 test.h #pragma once #include <qobject.h> #include <QFlags> class X…