题目放在这里:
接前一节:https://www.toutiao.com/article/7113727029614215719/
——————————————————————————————————————-
———————-准备知识分割线————————————————————————
温故而知新,这里先复习下Elastic search的相关概念:
0.什么是ES?
摘自:https://cloud.tencent.com/developer/article/1750560
- Elasticsearch 是分布式搜索和分析引擎。
- Elasticsearch 为所有类型的数据提供近实时(near real-time)的搜索和分析。
常用场景:
- 网站搜索
- ELK 日志采集,存储,分析
- 地理信息系统分析
像下图中使用的设计:
特点:
- ES是一个分布式文档存储,存储的数据都是序列化为 JSON documents 。
- 使用倒排索引存储数据,倒排索引比较适合全文本搜索。
- 基于Apache Lucene搜索引擎库,可以存储,检索文档及元数据。
- 支持 JSON 样式的查询语言 —— Query DSL,也支持 SQL 样式的查询。
- 集群部署,易于扩展。节点(node)分片(shard),将新的 node 添加到集群时,ES 会自动迁移 shard 到新 node 上,重新平衡集群。shard 分为两种 主分片(primary shard)和 副本分片 (replica shard)replica shard 存放的是 primary shard 的冗余副本 —— 可以防止集群故障,数据丢失,同时可以提高搜索或检索速度。在创建索引时 primary shard 数量是固定的,而replica shard 数量是可以更改的。分片由索引配置,分片越多,维护索引则开销则越大,分片大小越大,则 ES 在增减节点重新平衡集群时,分片移动时间越长。
- 集群恢复:跨集群复制 (CCR),可以自动将索引从主集群同步到热备份的辅助远程集群。
1.ES 和MySql 对比?
1.1 拿ES 和 mysql 做对比,es 里面的document 相当于mysql的table, 而document 相当于row, field 相当于column;
而es 中间支持shard的概念,可以把一个表(index)拆到不同的分片(shard),不同分片放到不同的节点,并通过replicaset 来做冗余保护。
2.python 如何使用ES?
参考这篇文章:
https://elasticsearch-py.readthedocs.io/en/7.x/
这里讲了几个概念,支持异步,支持复杂查询,支持ssl 模式交互等。
- es 支持异步方式做交互,为了提高查询效率。
https://elasticsearch-py.readthedocs.io/en/7.x/async.html
2.支持复杂查询DSL ,需要调用单独的接口:
https://elasticsearch-dsl.readthedocs.io/en/latest/
简单接口模式如下图:7.0 版本
3.传说中的倒排索引到底是什么意思?
摘自:https://cloud.tencent.com/developer/article/1750560
什么是倒排索引?
倒排索引也可以成为反向索引。
作为开发咱们经常接触到的就是 MySql,假设有一堆技术书籍,并且已经编上号。
- Java 并发编程之美
- Java 开发手册
- 深入分布式缓存
- Java 并发程序设计
- 算法
- 数据结构与算法
– 如果放在 MySql 里面就是这样
此时我想查询所有关于 并发 的书籍。
select * from table_book where book_name like %并发%;
然后会开始遍历表格,查找到 1和4两条记录。
– 如果是倒排索引处理的话
首先会将每个名称进行分词,比如 Java 并发编程之美 会被分为 Java 、并发、 编程、 之 、美。分词结束之后按照词关联书籍的编号。
在倒排索引中搜索并发,然后进行检索,就很容易定位到关于并发书籍的编号。
——————————————————————————————————————-
———————-准备知识分割线————————————————————————
题目中要用到的几个函数:
es.count(index="index_name") 查询某table 中的条目数量,返回值是一个字典,含count 值和shard值。取count值即可获取相关信息。
向ES里某个表里插入JSON数据:
es.index(index="inventory", id = int(id)+1 ,document={“name”:name,'Serial number':sn,'Value':value}
from Flask import Flask,render_template,request,url_for,redirect,jsonify
from datetime import date
import requests
from elasticsearch import Elasticsearch
app = Flask(__name__)
def store_into_es(name,sn,value):
#连接ES
es = Elasticsearch(['https://**.public.tencentelasticsearch.com:9200'],basic_auth=('elastic', '**'), sniff_on_start=False,sniff_on_node_failure=False,sniff_timeout=None)
# 查看inventory 表中的信息
id = es.count(index='inventory')['count']
print(id)
print(es.count(index='inventory'))
#print("the id is ".format(id))
try:
print("the id is {0}, we need +1".format(id))
except:
print("the id is not exist")
id = 0
print("The info to be stored is {0}".format({'name':name,'Serial number':sn,'value':value}))
res = es.index(index="inventory",id=int(id)+1,document={'name':name,'Serial number':sn,'value':value})
print(res)
return 1
def display_es():
# 连接ES
list1 =[]
es = Elasticsearch(['https://**.public.tencentelasticsearch.com:9200'],basic_auth=('elastic', '**'), sniff_on_start=False, sniff_on_node_failure=False,sniff_timeout=None)
# 查看inventory 表中的信息
id = es.count(index='inventory')['count']
for i in range(1, id + 1):
res = es.get(index="inventory", id=i)
print(res['_source'])
list1.append(res['_source'])
return list1
"""
1.把数据json化, {'name':name,'Serial number':sn,'value':value};
2.把json数据插入表格inventory,其中id 为之前的id+1;
3.
"""
@app.route('/api/input/',methods=['POST'])
def edit():
name = request.json['name']
sn = request.json['sn']
value = request.json['value']
result = store_into_es(name,sn,value)
if result == 1:
info = "The inventory info is successful stored"
else:
info = "Something goes wrong, can not store into storage"
return jsonify("info",info)
@app.route('/api/display/',methods=['POST'])
def display_info():
list1 = display_es()
return jsonify("enventory info",list1)
if __name__ =='__main__':
app.run(host='0.0.0.0',port=8008,debug=True)
上代码,
看下插入的效果:
插入一条数据:{"name":"testitem22", "sn":"12164", "value":"434"}
后台返回信息拆入成功:
展示所有列表信息:
后台现实的信息
这里只完成了2个功能:
插入和搜索所有列表。还有一个模糊搜索,匹配。
明天继续。
创业项目群,学习操作 18个小项目,添加 微信:jjs406 备注:小项目!
如若转载,请注明出处:https://www.xmjzwang.com/440.html