ES 分布式搜索入门

1 主流分布式搜索引擎

1.1 Lucene

Lucense官网地址http://lucene.apache.org

Lucene是一套用于全文检索搜索开放源码程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索。Lucene是现在最受欢迎的免费Java信息检索程序库。

1.2 Solr

Solr官网地址https://lucene.apache.org/solr/

Solr(读作“solar”)是Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示[1]分面搜索、动态聚类、数据库集成,以及富文本(如WordPDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,[2]Solr 4还增加了NoSQL支持。[3]

Solr是用Java编写、运行在Servlet容器(如Apache TomcatJetty)的一个独立的全文搜索服务器。 Solr采用了Lucene Java搜索库为核心的全文索引和搜索,并具有类似RESTHTTP/XMLJSONAPI。 Solr强大的外部配置功能使得无需进行Java编码,便可对其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。

因为2010年Apache Lucene和Apache Solr项目合并,两个项目是由同一个Apache软件基金会开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。

1.3 Elasticsearch

ElasticSearch官网地址https://www.elastic.co/cn/elasticsearch/

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。官方客户端在Java.NETC#)、PHPPythonApache GroovyRuby和许多其他语言中都是可用的。[5]根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。[6]

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

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

Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating[8],如果新文档与注册查询匹配,这对于通知非常有用。

另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。[9]Elasticsearch支持实时GET请求,适合作为NoSQL数据存储[10],但缺少分布式事务。[11]

2 ES核心术语

2.1 基础术语

Index

索引,包含了一堆有相似数据结构的文档数据,比如电影索引,一个索引包含很多document,一个索引就代表一类相似或者相同的document。

索引简单来说就相对于关系型数据库的库

Type

类型,每个索引里可以有一个或者多个type,type是index的一个逻辑分类,例如建立电影的索引,电影可以分为多个type:科幻type、喜剧 type、魔幻type等等。每个type下的document中的field可能是不一样的。

类型简单来说就相对于关系型数据库的表

Document

文档是信息的基本单元,一个document相当于一条数据,是可以被索引的,文档是以JSON的格式表现的。

文档相对于关系型数据库的行

Field

字段,document由多个field组成,不同类型的document里面同名的field一定具有相同的类型。

Mapping

Mapping 类似于关系数据库的表结构定义 schema

2.2 集群相关

Near Realtime

近实时,有两层含义:

  • 从写入数据到数据可以被搜索到有一个小延迟(大概是 1s)
  • 基于 es 执行搜索和分析可以达到秒级

Cluster 集群

集群包含多个节点,每个节点属于哪个集群都是通过一个配置来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。

Node 节点

Node 是集群中的一个节点,每个节点有一个唯一的名称,这个名称默认是随机分配的。默认节点会去加入一个名称为elasticsearch的集群。如果直接启动一堆节点,那么它们会自动组成一个 elasticsearch 集群,当然一个节点也可以组成 elasticsearch集群。

shard

单台机器无法存储大量数据,es 可以将一个索引中的数据切分为多个 shard,分布在多台服务器上存储。有了 shard 就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个 shard 都是一个 Lucene index。

replica

任何一个服务器随时可能故障或宕机,此时 shard 可能就会丢失,因此可以为每个 shard 创建多个 replica 副本。replica 可以在 shard 故障时提供备用服务,保证数据不丢失,多个 replica 还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认 5 个),replica shard(随时修改数量,默认 1 个),默认每个索引 10 个 shard,5 个 primary shard,5个 replica shard,最小的高可用配置,是 2 台服务器。

这么说吧,shard 分为 primary shard(主分片) 和 replica shard(备份节点)。而 primary shard 一般简称为 shard,而 replica shard 一般简称为 replica。

3 倒排索引

源数据

文档ID文档内容
1elasticsearch是最流行的搜索引擎
2php是世界上最好的语言
3搜索引擎是如何诞生的

倒排索引

单词文档ids词频TF:位置POS
elasticsearch11:1:<1>
流行11:1:<2>
搜索引擎1,31:1:<3>,3:1:<1>
php22:1:<1>
世界22:1:<2>
最好22:1:<3>
语言22:1:<4>
如何33:1:<2>
诞生33:1:<3>

1:1:<3>,3:1:<1>代表的含义

DocIdTFPosition
113
311

docId: 文档ID

TF: 代表分词项在某个点文档中出现的次数(term frequency)

Position: 某个单词的所有文档的文档列表及单词在该文档中出现的位置信息

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项,都包含一个属性值和包含该属性值的各个记录地址。由于不是根据记录来确定属性,而是根据属性来确定记录的位置,所以称之为倒排索引。

4 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小P聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值