你知道Python如何操作ES吗?(多图版)
程序员文章站
2022-07-15 12:28:20
...
ES
前言
如果没有安装安装ES可以参考这篇文章:
Elasticsearch 安装使用及其常见错误现象
ES的基本使用(postman版)
ES 和数据库可以进行类比学习。
传统数据库 | database | Rows | columns |
---|---|---|---|
ES | Index | Type | Document |
传统数据库只能保存简单的数据类型。而ES 可以保存更加复杂的数据类型。
{
“name”:”zs”,
“age”: 18,
…
}
创建index
查看所有的索引
查看当前索引
删除索引
创建文档
查询文档
ES基本使用(Python版)
创建car 的 属性
{
"mappings":{
"car":{
"properties":{
"c_name":{
"type":"keyword"
},
"c_date":{
"type":"date",
"format":"yyyy-MM-dd"
},
"c_mileage":{
"type":"float"
},
"c_city":{
"type":"text"
},
"c_price":{
"type":"float"
},
"c_sale":{
"type":"text"
},
"c_service":{
"type":"text"
}
}
}
}
}
安装连接es的模块
pip install elasticsearch
使用python脚本插入10000 条数据
import random
from elasticsearch import Elasticsearch
es = Elasticsearch("自己ES的ip号", timeout=360) # 链接服务器,设置超时时间
# 尝试保存10000条数据
c_names = """奥迪
宾利
宝马
华晨
比亚迪
别克
凯迪知拉克
雪佛兰
克莱斯道勒
一汽
法拉利
菲亚特
福特
本田
捍马回
现代
捷豹
吉普
起亚
兰博基尼
路虎
雷克撒斯
林肯
莲花
玛莎拉蒂
迈巴赫
马自达
奔驰答
迷你
三菱
日产
欧宝
标志
保时捷
雷诺
劳斯莱斯
萨博
斯科达
世爵
斯巴鲁
铃木
丰田
大众""".split("\n")
c_citys = "郑州市、洛阳市、焦作市、商丘市、信阳市、周口市、鹤壁市、安阳市、濮阳市、驻马店市、\
南阳市、开封市、漯河市、许昌市、新乡市、济源市、灵宝市、偃师市、邓州市、登封市、三门峡市、\
新郑市、禹州市、巩义市、永城市、长葛市、义马市、林州市、项城市、汝州市、荥阳市、\
平顶山市、卫辉市、辉县市、舞钢市、新密市、孟州市、沁阳市、郏县".split("、")
for i in range(10000):
data = {
"c_name": random.choice(c_names),
"c_date": "%s-%s-%s" % (
random.randint(1983, 2020),
random.randint(1, 12),
random.randint(1, 28)
),
"c_mileage": random.randint(1, 10000),
"c_city": random.choice(c_citys),
"c_price": random.randint(8, 100),
"c_sale": random.randint(1, 3),
"c_service": random.randint(30, 100)
} # 构建插入数据的结构
res = es.index(index="carlist", doc_type="car", body=data) # 开始执行
# print(res)
print('插入完成了....')
基本查询
from elasticsearch import Elasticsearch
es = Elasticsearch(hosts='自己的ESip', timeout=360)
body = {
# 1. 精确查询
# "query": {
# "term": {
# "c_name": '宝马'
# }
# }
# 2.多条件查询
# "query": {
# "terms": {
# "c_name": ['宝马', '丰田'] # 查询宝马和丰田
# }
# }
# 3.查询所有
# "query": {
# "match_all": {}
# }
# 4.分页
# "query": {
# "match_all": {}
# },
# 'from': 0,
# 'size': 100
# 5. 排序
# "query": {
# "match_all": {}
# },
# 'sort': ['c_date','c_price'] # 升序
# 'sort': {
# "c_date": {
# "order": 'desc' # 降序
# }
# }
# 6. 模糊查询 es --->> 分词
# "query": {
# "match": {
# 'c_name': '宝马'
# }
# }
# 7. 逻辑
# must
# "query": {
# "bool": {
# "must": [
# {
# 'term': {
# 'c_name': '宝马'
# }
# },
# {
# 'term': {
# 'c_price': 18
# }
# }
# ]
# }
# }
# should 表示 或者
# "query": {
# "bool": {
# "should": [
# {
# 'term': {
# 'c_name': '奔驰'
# }
# },
# {
# 'term': {
# 'c_price': 80
# }
# }
# ]
# }
# }
# must_not 非
# "query": {
# "bool": {
# "must_not": [
# {
# 'term': {
# 'c_name': '宝马'
# }
# },
# {
# 'term': {
# 'c_price': 80
# }
# }
# ]
# }
# }
# 8.查询范围 range
# 'query': {
# 'range': {
# 'c_price': {
# 'gt': 20, # 大于
# 'lt': 30 # 小于
# }
# }
# }
# 9. 聚合
# 'query': {
# 'term': {
# 'c_name': '宝马'
# }
# },
# 'aggs': {
# 'price_avg': {
# 'avg': {
# 'field': 'c_price'
# }
# }
# }
# 10. 分组
'query': {
'match_all': {}
},
'aggs': {
'car_sum': {
'terms': {
'field': 'c_name'
}
}
}
}
# select * from car where c_name='宝马'
result = es.search(index='carlist', doc_type='car', body=body)
print(result)
# car_list = result['hits']['hits']
# for car in car_list:
# print(car['_source'])