python操作Elasticsearch执行增删改查

文章目录

  • 基本操作
  • 更多查询方法
    • [1. 查询全部数据](#1. 查询全部数据)
    • [2. 针对某个确定的值/字符串的查询:term、match](#2. 针对某个确定的值/字符串的查询:term、match)
    • [3. 在多个选项中有一个匹配,就查出来:terms](#3. 在多个选项中有一个匹配,就查出来:terms)
    • [4. 数值范围查询:range](#4. 数值范围查询:range)
    • [5. 多个条件同时触发 bool](#5. 多个条件同时触发 bool)
    • [6. 指定返回值个数 size](#6. 指定返回值个数 size)
    • [7. 返回指定列 _source](#7. 返回指定列 _source)
  • 完整示例程序

基本操作

  1. 首先连接Elasticsearch数据库,然后创建一个自定义的索引
py 复制代码
from elasticsearch import Elasticsearch
import random
from elasticsearch import helpers

# 连接到本地的 Elasticsearch 服务
es = Elasticsearch(hosts=["http://localhost:9200"])
index_name = "my_index"

# 创建一个索引名为 "my_index" 的索引
if es.indices.exists(index=index_name):  # 如果索引存在,删除
    es.indices.delete(index=index_name)
es.indices.create(index=index_name)  # 新建索引
  1. 新增随机数据

这里我们创建随机数据项,包含value_num与value_choice项,

py 复制代码
# 新增随机数据项
add_value_list: list = []
for _ in range(1000):
    num = random.randint(1, 100)
    add_value_list.append({
        "_index": index_name,  # 注意!个参数决定要插入到哪个索引中
        "value_num": random.randint(1, 100),
        "value_choice": ["c1", 'c2', 'c3'][random.randint(0, 2)],
    })
# 批量插入数据
helpers.bulk(es, add_value_list)
  1. 查询操作
py 复制代码
# 查询操作
_body_query = {
    "query": {
        "range": {
            "value_num": {
                "gte": 40,  # >= 40
                "lte": 60  # <= 60
            }
        }
    },
    "size": 20,  # 查询20条
}
response = es.search(index=index_name, body=_body_query)
# 打印查询的结果
for _hit in response["hits"]["hits"]:
    _value = _hit['_source']
    print("value_num:", _value["value_num"], " value_choice:", _value['value_choice'])
  1. 更新数据项

这里,我们将查询出的数据中,通过文档ID与修改的数据重新为数据赋值

py 复制代码
# 更新操作
for _hit in response["hits"]["hits"]:
    update_body = {"doc": {
        "value_choice": "c4",  # 更新value_choice字段为c4
    }}
    res = es.update(index=index_name, id=_hit['_id'], body=update_body)
  1. 删除数据项
py 复制代码
# 删除操作
for _hit in response["hits"]["hits"]:
    res = es.delete(index=index_name, id=_hit['_id'])

更多查询方法

1. 查询全部数据

py 复制代码
_body_query = {
    "query":{
        "match_all":{}
    }
}

2. 针对某个确定的值/字符串的查询:term、match

match会执行多个term操作,term操作精度更高

py 复制代码
_body_query = {
    "query": {
        "match": {
            "value_choice": "c1"
        }
    }
}
py 复制代码
_body_query = {
    "query": {
        "term": {
            "value_choice": "c1"
        }
    }
}

3. 在多个选项中有一个匹配,就查出来:terms

py 复制代码
_body_query = {
    "query": {
        "terms": {
            "value_choice": ["c1", "c2"],
        }
    }
}

4. 数值范围查询:range

查询>=40且<=60的数据

py 复制代码
_body_query = {
    "query": {
        "range": {
            "value_num": {
                "gte": 40,  # >= 40
                "lte": 60  # <= 60
            }
        }
    }
}

5. 多个条件同时触发 bool

布尔查询可以同时查询多个条件,也称为组合查询,构造查询的字典数据时,query后紧跟bool,之后再跟bool的判断条件,判断条件有下面几个:

  • filter:过滤器
  • must:类似and,需要所有条件都满足
  • should:类似or,只要能满足一个即可
  • must_not:需要都不满足

写完判断条件后,在判断条件的list里再紧跟查询操作的具体细节

py 复制代码
_body_query = {
    "query": {
        "bool": {
            "should": [
                {
                    "match": {"value_choice": "c1"} # value_choice = "c1"
                },
                {
                    "range": {"value_num": {"lte": 50}} # value_num <= 50
                }
            ]
        }
    },
}

6. 指定返回值个数 size

在构造的字典中添加size关键字即可

py 复制代码
_body_query = {
    "query": {
        "range": {
            "value_num": {
                "gte": 40,  # >= 40
                "lte": 60  # <= 60
            }
        }
    },
    "size": 20,
}

7. 返回指定列 _source

py 复制代码
_body_query = {
    "query": {
        "range": {
            "value_num": {
                "gte": 40,  # >= 40
                "lte": 60  # <= 60
            }
        }
    },
     "_source": ["value_num"] # 这里指定返回的fields
}

完整示例程序

py 复制代码
from elasticsearch import Elasticsearch
import random
from elasticsearch import helpers

# 连接到本地的 Elasticsearch 服务
es = Elasticsearch(hosts=["http://localhost:9200"])
index_name = "my_index"

# 创建一个索引名为 "my_index" 的索引
if es.indices.exists(index=index_name):  # 如果索引存在,删除
    es.indices.delete(index=index_name)
es.indices.create(index=index_name)  # 新建索引

# 生成随机数据
add_value_list: list = []
for _ in range(1000):
    num = random.randint(1, 100)
    add_value_list.append({
        "_index": index_name,  # 注意!个参数决定要插入到哪个索引中
        "value_num": random.randint(1, 100),
        "value_choice": ["c1", 'c2', 'c3'][random.randint(0, 2)],
    })
# 批量插入数据
helpers.bulk(es, add_value_list)

# ================== 开始增删改查 ==================
_body_query = {
    "query": {
        "range": {
            "value_num": {
                "gte": 40,  # >= 40
                "lte": 60  # <= 60
            }
        }
    },
    "size": 20,
}

response = es.search(index=index_name, body=_body_query)  # 查询10条
# 打印查询的结果
for _hit in response["hits"]["hits"]:
    _value = _hit['_source']
    print("value_num:", _value["value_num"], " value_choice:", _value['value_choice'])

# 更新操作
for _hit in response["hits"]["hits"]:
    update_body = {"doc": {
        "value_choice": "c4",  # 更新value_choice字段为c4
    }}
    res = es.update(index=index_name, id=_hit['_id'], body=update_body)

# 删除操作
for _hit in response["hits"]["hits"]:
    res = es.delete(index=index_name, id=_hit['_id'])
相关推荐
程序员大雄学编程18 小时前
用Python来学微积分34-定积分的基本性质及其应用
开发语言·python·数学·微积分
Q_Q51100828518 小时前
python+django/flask的莱元元电商数据分析系统_电商销量预测
spring boot·python·django·flask·node.js·php
林一百二十八18 小时前
Python实现手写数字识别
开发语言·python
Q264336502318 小时前
【有源码】基于Hadoop+Spark的起点小说网大数据可视化分析系统-基于Python大数据生态的网络文学数据挖掘与可视化系统
大数据·hadoop·python·信息可视化·数据分析·spark·毕业设计
大叔_爱编程19 小时前
基于Python的历届奥运会数据可视化分析系统-django+spider
python·django·毕业设计·源码·课程设计·spider·奥运会数据可视化
Q_Q196328847520 小时前
python+django/flask基于协同过滤算法的理财产品推荐系统
spring boot·python·django·flask·node.js·php
高洁0120 小时前
面向强化学习的状态空间建模:RSSM的介绍和PyTorch实现(3)
人工智能·python·深度学习·神经网络·transformer
aloha_78920 小时前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
Archy_Wang_120 小时前
基于BaGet 构建NuGet私有库并实现类库打包到NuGet私有库
运维·jenkins
Jonathan Star21 小时前
MediaPipe 在Python中实现人体运动识别,最常用且高效的方案是结合**姿态估计**(提取人体关键点)和**动作分类**(识别具体运动)
开发语言·python·分类