python3 elasticsearch 先看下面我给准备的干货,如果不能满足,pls
官网文档 :https://pypi.org/project/elasticsearch/
dev 文档: https://elasticsearch-py.readthedocs.io/en/v7.15.1/
开发API官网 例子: https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/examples.html
update delete documnt 见文章最后
1依赖: python3.7
pip3 install elasticsearch==7.9.1
1、连接ES,创建索引
from elasticsearch import Elasticsearch
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
index_name = 'my_index'
request_body = {
'mappings': {
'properties': {
'name': {
'type': 'text'
},
'id': {
'type': 'integer'
},
}
}
}
# 创建索引
es.indices.create(index=index_name, body=request_body)
2、判断索引是否存在
为防止在创建索引的时候出现重复,产生错误,在创建之前最好判断一下索引是否存在
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
# 索引存在,先删除索引
if es.indices.exists(index_name):
es.indices.delete(index=index_name)
else:
print('索引不存在,可以创建')
# 创建索引
es.indices.create(index=index_name, body=request_body)
# 查看索引的信息
print(es.info())
也可以访问 :localhost:9200/_cat/indices?v 查看所有的索引
3、删除索引
删除指定地址的ES服务的索引
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
es.indices.delete(index=index_name)
4、索引增加数据
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
request_body = {
'mappings': {
'properties': {
'name': {
'type': 'text'
},
'id': {
'type': 'integer'
},
}
}
}
# 索引存在,先删除索引
if es.indices.exists(index_name):
es.indices.delete(index=index_name)
else:
print('索引不存在,可以创建')
# 创建索引
es.indices.create(index=index_name, body=request_body)
es.index(index=index_name, id='1', body={
'name': '法外狂徒-张三',
'id': 1,
}
)
es.index(index=index_name, id='2', body={
'name': '普法教育-李四',
'id': 2,
}
)
5、获取数据
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
# 查询数据包含两种 get search
# get 查询数据
res = es.get(index=index_name, id='1') # 我用的是es7,doc_type 可以不传,也可以查询到
# search 查询数据
# 查询所有商品数据 match_all
body = {
'query': {
'match_all': {}
},
'from': page * page_size, # 从第几条数据开始
'size': page_size # 获取多少条数据
}
requ_data = es.search(index=index_name, body=body)
# 精确查找 term 查询name='法外狂徒-张三'的所有数据
body = {
'query': {
'term': {
'name': '法外狂徒-张三'
}
},
}
# 精确查找 terms
body = {
'query': {
'terms': [
'法外狂徒-张三', '普法教育-李四'
]
},
}
# match: 匹配name包含 ‘法外狂徒-张三’的所有数据
body = {
'query': {
'match': [
'name': '法外狂徒-张三'
]
},
}
# 查询id和name包含 法外狂徒-张三
body = {
'query': {
'multi_match': [
'query': '法外狂徒-张三',
'fields': ['name', 'id']
]
},
}
# 搜索出id为1或者2的所有数据
body = {
'query': {
'ids': [
'type': 'test_type',
'values': ['1', '2']
]
},
}
6、复合查询bool
# 符合查询bool
# bool有3类查询关系,must(都满足),should(其中一个满足),must_not(都不满足)
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
body = {
'query': {
'bool': {
'must': [
{
'term': {
'name': '法外狂徒-张三'
}
},
{
'term': {
'id': 1
}
}
]
}
}
}
# 查询name=‘法外狂徒-张三’并且id=1的数据
es.search(index=index_name, body=body)
7、切片式查询
# 切片式查询
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
body = {
'query': {
'match_all': {}
},
'from': 2, # 从第二条数据开始
'size': 4 # 获取4条数据
}
# 从第2条数据开始,获取4条数据
es.search(index=index_name, body=body)
8、范围查询
# 范围查询
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
body = {
'query': {
'range': {
'id': {
'gte': 1, # >=1
'lte': 5, # <=5
}
}
},
}
# 查询1<=id<=5的所有数据
# gte 和 lte 也可以换成换成 from 和 to
es.search(index=index_name, body=body)
9、前缀查询
# 前缀查询
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
body = {
'query': {
'prefix': {
'name': '法'
}
},
}
# 查询前缀为 ‘法’的所有数据
es.search(index=index_name, body=body)
10、通配符查询
# 通配符查询
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
body = {
'query': {
'wildcard': {
'name': '*三'
}
},
}
# 查询所有以 ‘三’结尾的数据
es.search(index=index_name, body=body)
11、查询的数据排序
# 排序查询
from elasticsearch import Elasticsearch
index_name = 'my_index'
es = Elasticsearch(
['127.0.0.1:9200'],
# 在做任何操作之前,先进行嗅探
# sniff_on_start=True,
# # 节点没有响应时,进行刷新,重新连接
sniff_on_connection_fail=True,
# # 每 60 秒刷新一次
sniffer_timeout=60
)
body = {
'query': {
'match_all': {}
},
'sort': {
'id': { # 根据id字段升序排序
'order': 'asc' # asc 升序, desc 降序
}
}
}
# 查处所有数据并按照id大小排序
es.search(index=index_name, body=body)
11. update documnt: update:https://www.elastic.co/guide/en/elasticsearch/reference/7.15/search-search.html
To update a document, you need to specify three pieces of information: index, id, and a body:
from datetime import datetime
from elasticsearch import Elasticsearch
es = Elasticsearch()
doc = {
'author': 'author_name',
'text': 'Interesting modified content...',
'timestamp': datetime.now(),
}
res = es.update(index="test-index", id=1, body=doc)
print(res['result'])
12 Deleting a document
You can delete a document by specifying its index, and id in the delete() method:
es.delete(index="test-index", id=1)
原文:https://blog.csdn.net/weixin_41979456/article/details/111932972
