博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】本文记录一下使用 python 3 对 elasticsearch 的增删改查基本操作,批量插入、批量修改等等可能出现的操作,用于方便以后的使用。
一共有三个文件,每个文件包含的头部是一样的如下:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import sys
import random
import time
from elasticsearch import Elasticsearch
from elasticsearch import helpers
# 绿色表示一切正常, 黄色表示所有的数据可用但是部分副本还没有分配,红色表示部分数据因为某些原因不可用
# 以下所有的增删改查都可以追本溯源,在《Elasticsearch 权威指南(中文版)》一书中可以找到对应的方法,
# 操作形式不同,但是原理上是一致的,链接地址是:https://es.xiaoleilu.com/
#### 索引 ####
index_name = "bangbangas" # 索引名称
type_name = "my-type" # 类型名称
alias_name = "bangbang" # 索引别名
host_name = "127.0.0.1"
port = 9200
es = Elasticsearch([{'host':host_name,'port':port}])
为了避免由于每个操作之间互相造成的影响,所以将其分为三个部分,每个操作的顶部都是一样的共同部分。
操作 1 :
# 判断索引是否存在,若存在先删除则创建
if es.indices.exists(index=index_name) == True:
es.indices.delete(index=index_name) # 刪除索引
# 创建索引
settings = {
"settings": {
"number_of_shards" : 5,
"number_of_replicas" : 1
}
}
es.indices.create(index=index_name,body=settings)
# 查询索引别名是否存在
if es.indices.exists_alias(index=index_name,name=alias_name) == True:
es.indices.delete_alias(index=index_name,name=alias_name) # 若已存在,则删除别名
es.indices.put_alias(index=index_name,name=alias_name) # 若不存在,则创建索引别名
result = es.indices.get_alias() # 查看所有索引及对应别名
result = es.indices.get_alias().keys() # 查询所有索引的名称
result = es.indices.get(index_name) # 查询索引信息,包含 mapping settings 信息
result = es.indices.get_mapping(index_name) # 查看索引的 mapping 信息
result = es.indices.get_settings(index_name) # 查看索引的 settings 信息
#### 文档操作 ####
data = {
"name":"hello world",
"age":18
}
# 使用 create 方法创建文档时,必须指定 id ,并且 id 不能是已经存在的
es.create(index=index_name,doc_type=type_name,id=1,body=data)
# 判断指定 id 的文档是否存在
if es.exists(index=index_name,doc_type=type_name,id=2) == False:
data = {
"name":"english",
"age":20
}
es.create(index=index_name,doc_type=type_name,id=2,body=data)
# 使用 index 方法来创建文档,可以不设置 id ,id 也可以已经存在的。
# 若 id 没有设置,则随机生成一个 22 位的字符串;若 id 已存在,则修改文档内容
data = {
"name":"hi",
"age":18
}
es.index(index_name,doc_type=type_name,id=1,body=data) # 修改 id 为 1 的文档
es.index(index_name,doc_type=type_name,body=data) # 创建一个 id 自动生成的文档
# 批量插入文档,使用 helper.bulk()
i = 3
actions = []
data = [
{"name":"福建省龙岩市永定县","age":30},
{"name":"山东省青岛市黄岛区","age":16},
{"name":"江苏省无锡市滨湖区","age":24},
{"name":"北京市朝阳区双井街","age":18},
{"name":"福建省龙岩市新罗区","age":16},
{"name":"aabbcc","age":17},
{"name":"aaccbb","age":17},
{"name":"bbaacc","age":17},
{"name":"bbccaa","age":17},
{"name":"ccaabb","age":17},
{"name":"ccbbaa","age":17},
]
for j in data:
action = {
"_index":index_name,
'_type':type_name,
'_id':i,
'_source':j,
}
i += 1
actions.append(action)
helpers.bulk(es,actions)
操作 2 :
#### 查询文档 ####
# 获取指定 id 的文档
if es.exists(index=index_name,doc_type=type_name,id=1) == True:
res = es.get(index=index_name, doc_type=type_name, id=1) # 获取 id 为 1 的文档
# 查询所有文档,默认显示前 10 条
query = {
'query': {
'match_all': {}
}
}
res = es.search(index=index_name,body=query) # 查询索引的所有文档
total = res['hits']['total'] # 查询的总数
if total > 0 :
numberOne = res['hits']['hits'][0] # 返回结果中第一个记录
res = es.search(body=query) # 查询所有索引的所有文档,默认显示十条
# 全文搜索
query = {
'query':{
'match':{
"name":"龙岩 永定"
}
}
}
res = es.search(index=index_name,doc_type=type_name,body=query)
#### 修改文档 ####
# 使用 update 修改文档,必须指定 id,且采用 {"doc":{}} 格式
doc = {
"doc":{
"name":"hello world",
"age":20
}
}
if es.exists(index=index_name,doc_type=type_name,id=1) == True:
res = es.update(index=index_name,doc_type=type_name,id=1,body=doc) # 修改 id 为 1 的文档
# 休眠 2 秒,避免发生冲突
time.sleep(2)
# 使用 update_by_query 批量修改符合条件的文档
query = {
"script":{
"lang": "painless",
"inline": "ctx._source.age=" + str(random.randint(10,30))
},
"query":{
"range":{
"age":{
"lte":30,
"gte":18
}
}
}
}
try:
# 执行更新的时候可能会发生冲突,所有为了保证程序的正常运行,需要对异常进行处理
res = es.update_by_query(index=index_name,doc_type=type_name,body=query) # 将 age >= 18 && age <= 28 的文档 age 修改为 24
except Exception as e:
print("error")
### 注意 ###
# 这里在短时间内先修改 id = 1 的文档,而后又批量修改所有文档,对于 id = 1 的文档容易发生冲突问题,要避免冲突问题,所以采用休眠 2 秒的方法来避免短时间内发生冲突的可能
操作 3 :
#### 删除文档 ####
# 删除指定 id 的文档,必须指定 id,且 id 必须存在
if es.exists(index=index_name,doc_type=type_name,id=100) == True:
res = es.delete(index=index_name, doc_type=type_name, id=100)
if es.exists(index=index_name,doc_type=type_name,id=1) == True:
res = es.delete(index=index_name,doc_type=type_name,id=1)
# 停顿 2 秒,避免冲突
time.sleep(2)
# 按条件批量删除符合条件的文档
query = {
"query":{
"match":{
"age":16
}
}
}
query = {
"query":{
"range":{
"age":{
"gte":18,
"lte":30
}
}
}
}
try:
res = es.delete_by_query(index=index_name,body=query)
except Exception as e:
print("error")
后续如果有新的操作,会更新本文的。
版权归 马富天个人博客 所有
本文标题:《Python 3 针对 elasticsearch 的增删改查操作》
本文链接地址:http://www.mafutian.com/399.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||