本文正在参与「金石方案」

Elasticsearch简单介绍

公司技术栈用到了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+树),因而检索功率在数据比较多的情况下查询速度也是比较快的。

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

但是假如咱们查询title列的每一行数据是否包括“手机”这一字段时,咱们会用到含糊查询(即便title字段设置了索引,索引也不会生效)select * from goods where title = %手机%,此刻会进行逐行扫描,判别每一行的title列是否包括“手机”。假如表中的行数比较多,此刻逐行扫描所要花费的时间是适当长的,因而查询功率会显得十分十分慢!

对于全文检索的查询方法,倒排索引能够处理这一难题!

倒排索引用到的术语有:

文档:表中的每一条记载(数据)便是一个文档 词条:文档中依照语义划分红的词语便是词条 索引:相同类型的文档的集合 类型:表明数据结构,适当于表结构中描绘字段的类型 映射:索引中文档的字段约束信息,类似于表的信息

公司技术栈用到了Elasticsearch,我对此知识进行了回顾
对于以上的表,不管有多少条文档,咱们都能够依据语义划分的词条,构成右边倒排索引的方式,假如文档中有重复词条呈现,咱们在右边记载文档的id即可。 比方咱们作为用户,想要查找华为手机,咱们输入的词语会被分红“华为”和“手机”两个词条,之后会依据词条列表在倒排索引表中找到包括该词条的id,会再依据id再次查询:
公司技术栈用到了Elasticsearch,我对此知识进行了回顾
倒排索引的进程经过了两次检索,首要经过用户的词条查找文档id,之后会拿着文档id去文档中检索,找到合适的成果。由于两次检索都经过索引进行查询,所以查询功率比正向索引功率高很多。 正向索引是依据文档id查询词条,判别每条文档是否包括想要的词条;而倒排索引是经过对一切文档的内容进行分词,对词条创建索引,同时记载词条在文档中的方位。查询的时分先依据词条查询到文档的id,然后再经过文档id找到想要的文档,两次查询均走索引。

文档数据会被序列化为json格式存储在elasticsearch中,对于咱们上面的数据,在elasticsearch中这样存储:

公司技术栈用到了Elasticsearch,我对此知识进行了回顾
依据文档的类型,相同类型的文档会被划分到相同的索引库中。

  • 一切用户文档,就能够安排在一起,称为用户的索引;
  • 一切产品的文档,能够安排在一起,称为产品的索引;
  • 一切订单的文档,能够安排在一起,称为订单的索引;
    公司技术栈用到了Elasticsearch,我对此知识进行了回顾

MySQL和Elasticsearch对比

在MySQL中,咱们对数据库完成增删改查是经过select,delect,update,insert等句子完成的。在Elasticsearch中,是经过DSL句子完成的crud,是一种json风格的恳求语法,依据http恳求发送,和言语无关。

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

MySQL:拿手业务类型(ACID)操作,能够确保数据的安全和一致性; Elasticsearch:拿手海量数据的查找,剖析,核算(如产品,页面查找)

公司技术栈用到了Elasticsearch,我对此知识进行了回顾
Elasticsearch和数据库的关系为互补关系,数据库首要负责业务类型操作,Elasticsearch首要负责海量数据的查找,剖析核算等。

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