网站首页 > 博客文章 正文
题目放在这里:
接前一节: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个功能:
插入和搜索所有列表。还有一个模糊搜索,匹配。
明天继续。
猜你喜欢
- 2024-10-24 持久层框架JPA与Mybatis该如何选型
- 2024-10-24 hibatis--mybatis,自动生成SQL, 通用Mapper, 通用Dao
- 2024-10-24 Elasticsearch 6.0.0官方参考指南翻译
- 2024-10-24 推荐一个高效美观易用的服务器运维工具
- 2024-10-24 Java 操作之RestHighLevelClient查询详解
- 2024-10-24 如何在 Elasticsearch 上应用机器学习排序插件
- 2024-10-24 「开源资讯」Apache Solr 8.6.0 发布,Java 全文搜索服务器
- 2024-10-24 最轻量级的Kubernetes云原生日志框架Loki
- 2024-10-24 ElasticSearch学习系列 - (3) Python操作es
- 2024-10-24 全功能orm工具sorms 1.0.10 发布,合使用Spring,Spring boot用户
你 发表评论:
欢迎- 05-30springboot 集成redisson 以及分布式锁的使用
- 05-30去哪儿技术面:10亿数据如何最快速插入MySQL?
- 05-30redis介绍
- 05-30redission YYDS
- 05-30手把手教你springboot集成mybatis
- 05-30mybatis根据表逆向自动化生成代码:自动生成实体类、mapper文件
- 05-30越来越大的微信小程序
- 05-30SpringBoot之数据访问——访问SQL数据库!
- 413℃用AI Agent治理微服务的复杂性问题|QCon
- 412℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 394℃初次使用IntelliJ IDEA新建Maven项目
- 391℃Maven技术方案最全手册(mavena)
- 385℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 383℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 383℃IT全明星|IntelliJ IDEA学习笔记(四、idea中怎么创建maven项目)
- 380℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)