公司技术栈用到了Elasticsearch,我对此知识进行了回顾

您所在的位置:网站首页 elasticsearch如何导入数据 公司技术栈用到了Elasticsearch,我对此知识进行了回顾

公司技术栈用到了Elasticsearch,我对此知识进行了回顾

2023-04-13 17:55| 来源: 网络整理| 查看: 265

本文正在参加「金石计划」

Elasticsearch简单介绍

在这里插入图片描述

百度上介绍的Elasticsearch相当全面,参考之整理如下:

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。

Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。被广泛应用于日志数据分析,实时监控等领域。

Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。

Lucene是用Java语言写的一个搜索引擎类库,其实就是一个jar包,里面包含了搜索引擎的核心API,在使用的时候只需要导入这个jar包即可。当然,Lucene是可以扩展的,并且是高性能的(倒排索引数据结构,便于查询)。

Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。

倒排索引

Elasticsearch搜索引擎是基于Lucene的倒排索引实现的,索引的好处就是帮助我们快速检索到我们想要的数据。

首先先回顾一下正向索引: 一般我们的数据库表会有id字段,并且id字段会被设置为主键索引,当我们查询语句为select * from goods where id = ??? 此时查询会走索引(底层实现b+树),因此检索效率在数据比较多的情况下查询速度也是比较快的。 在这里插入图片描述

但是如果我们查询title列的每一行数据是否包含“手机”这一字段时,我们会用到模糊查询(即使title字段设置了索引,索引也不会生效)select * from goods where title = %手机%,此时会进行逐行扫描,判断每一行的title列是否包含“手机”。如果表中的行数比较多,此时逐行扫描所要花费的时间是相当长的,因此查询效率会显得非常非常慢!

对于全文检索的查询方式,倒排索引可以解决这一难题!

倒排索引用到的术语有:

文档:表中的每一条记录(数据)就是一个文档 词条:文档中按照语义划分成的词语就是词条 索引:相同类型的文档的集合 类型:表示数据结构,相当于表结构中描述字段的类型 映射:索引中文档的字段约束信息,类似于表的信息

在这里插入图片描述 对于以上的表,无论有多少条文档,我们都可以根据语义划分的词条,形成右边倒排索引的形式,如果文档中有重复词条出现,我们在右边记录文档的id即可。 比如我们作为用户,想要搜索华为手机,我们输入的词语会被分成“华为”和“手机”两个词条,之后会根据词条列表在倒排索引表中找到包含该词条的id,会再根据id再次查询: 在这里插入图片描述 倒排索引的过程经过了两次检索,首先通过用户的词条搜索文档id,之后会拿着文档id去文档中检索,找到合适的结果。由于两次检索都通过索引进行查询,所以查询效率比正向索引效率高很多。 正向索引是基于文档id查询词条,判断每条文档是否包含想要的词条;而倒排索引是通过对所有文档的内容进行分词,对词条创建索引,同时记录词条在文档中的位置。查询的时候先根据词条查询到文档的id,然后再通过文档id找到想要的文档,两次查询均走索引。

文档数据会被序列化为json格式存储在elasticsearch中,对于我们上面的数据,在elasticsearch中这样存储: 在这里插入图片描述 根据文档的类型,相同类型的文档会被划分到相同的索引库中。

所有用户文档,就可以组织在一起,称为用户的索引; 所有商品的文档,可以组织在一起,称为商品的索引; 所有订单的文档,可以组织在一起,称为订单的索引; 在这里插入图片描述 MySQL和Elasticsearch对比

在MySQL中,我们对数据库实现增删改查是通过select,delect,update,insert等语句实现的。在Elasticsearch中,是通过DSL语句实现的crud,是一种json风格的请求语法,基于http请求发送,和语言无关。 在这里插入图片描述

MySQL:擅长事务类型(ACID)操作,可以确保数据的安全和一致性; Elasticsearch:擅长海量数据的搜索,分析,计算(如商品,页面搜索)

在这里插入图片描述 Elasticsearch和数据库的关系为互补关系,数据库主要负责事务类型操作,Elasticsearch主要负责海量数据的搜索,分析计算等。

本篇文章就先分享到这里了,后续会继续分享其他方面的知识,感谢大佬认真读完支持咯~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3