共计 2910 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要讲解了“elasticsearch 分布式搜索怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“elasticsearch 分布式搜索怎么实现”吧!
elasticsearch 概括
(基于互联网)
Elasticsearch 是一个基于 lucene 的、开源的、分布式的、RESTful 的搜索引擎。Elasticsearch 有如下特征:
1. 更快的执行搜索;
2. 安装简单;
3. 完全自由的搜索模式;
4. 可以简单地通过 HTTP 使用 JSON 索引数据;
5. 分布式,可对搜索集群;
6. 能够实时搜索;
7. 实现简单地多租户;
8. 等等。
很多时候我们使用 Elasticsearch 来代替 lucene 实现搜索,当然,代替的原因是因为其可实现搜索集群。
自由和面向文档的模式
搜索引擎的数据模型属于模式自由以及数据库是面向文档的,以目前 #nosql 的发展趋势来看,使用这种数据模型来构建应用程序已经被证明是非常高效的。
elasticsearch 的模型基于 JSON, 事实上,在近些年,它俨然已经成为数据呈现的一个标准,此外,通过 JSON,可以非常简单的表示半结构化的数据,同样的,大多数编程语言都会优先支持 JSON 数据的解析.
模式映射(Schema Mapping)
elasticsearch 是无模式的,你随便往里面扔一个 JSON 格式的文档,然后 ES 就可以自动的进行索引。输入的内容如果是数字或者是时间类型,ES 也自动的检测出来,并做相应的处理。
但是,众所周知,搜索引擎是非常复杂的,索引文档中的字段是可以设置 BOOST 值来影响打分的,另外还可以使用不同的分析器(Analyzer)用来控制怎么分词,比如有些字段是需要进行分词的,但是有些则不一定,如此等等。elasticsearch 允许你完全控制这些规则,最终将一个 JSON 文档映射到搜索引擎里面。并且可以按索引(Index)和按类型(Type)2 种级别来进行设置.。
获取数据(GETting Some Data)
每个索引的文档都必须要有一个唯一标识(在类型级别),在很多时候这是非常有用的,比如你想更新或者删除某一个索引文档,或者只是想拿一条索引数据看看。获取数据真是简单的不能再简单了,你只需用告诉 es 指定文档的索引、类型、和 id 就可以拿回实际的索引文档了(就是你建索引的时候的 JSON 文档)。
搜索(Search)
处理查询只需要一个简单的请求,里面隐藏了很多复杂的 es 提供的基于分布式的操作。可以简单的使用 Lucene 通用的语法,或者使用基于 JSON 格式 QueryDSL(DSL:领域特定语言)来构造搜索各种请求(更加灵活,方便构造复杂查询)。
搜索可不仅仅就是查询就结束了,方面 / 层面(facets),高亮,自定义脚本等等都是支持的。
多租户(Multi Tenancy)
单个索引既然已经有了,那为什么还会需要不止一个索引呢,其实,有很多原因需要支持多索引,比如,对日志索引可以按周来分别存放,或者是对不同的索引进行不同的设置(比如,一个使用内存作为存储,一个使用文件系统来存储)。
当有了多个索引之后,我们就想要能够跨索引来进行搜索(或者其他操作)。
设置(Settings)
能够进行配置本身就是一把双刃剑,我们想要的是能够打开就能尽快运行,中间无需任何配置,并且当有需要的时候能够控制应用程序的几乎所有方面。
elasticsearch 从构建之初就这种理念,所以几乎所有事情都是可配和可插拔的,此外,每个索引(index)都有其独立的配置,用来覆盖主配置(master settings)。举例来说,一个索引可以配置为使用内存存储,10 个分片和 1 个副本,而另外一个索引可以是使用文件系统存储,1 个分片和 10 个副本。所有的索引级别(index)的设置都是可以在创建索引的时候通过 YAML 或者 JSON 格式来进行指定的。
分布式(Distributed)
elasticsearch 的一个最主要的功能就是对分布式的支持,索引能够分拆为多个分片,每个分片可以有 0 个或者多个副本,集群中的每个数据节点,都可以承载一个或者多个分片,并且充当协调和处理各种操作分发到合适的分片上去。再平衡(Rebalancing)和路由(routing)这一切都是自动进行的。
时间之门(Gateway)
也许有一天,整个集群会崩溃(谁也无法保证因为什么原因),或者是因为特殊需要而进行关停,大多数情况,我们是需要让集群恢复到最后的一个状态的,并且让服务重新 run 起来,elasticsearch 提供了一个叫做 gateway 的模块,允许你来做这件事情,你可以想想时间机器和搜索的结合。
集群的状态信息(包括事务日志)可以通过每个本地存储(默认模式)来重建,或共享存储(如 NFS 或者 Amazon S3),当使用共享存储,集群状态信息会异步的复制过去。
此外,当使用共享存储来做持久化,索引信息可以完全的存放在内存里面,就算做整个集群的关闭再恢复也不会有问题。
集群(cluster)
集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es 的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看 es 集群,在逻辑上是个整体,你与任何一个节点的通信和与整个 es 集群通信是等价的。
索引分片(shards)
es 可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
索引副本(replicas)
es 可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高 es 的查询效率,es 会自动对搜索请求进行负载均衡。
数据重新分布(recovery)
es 在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
数据源(river)
也是其它存储方式(如:数据库)同步数据到 es 的一个方法。它是以插件方式存在的一个 es 服务,通过读取 river 中的数据并把它索引到 es 中,官方的 river 有 couchDB 的,RabbitMQ 的,Twitter 的,Wikipedia 的。
Transport
代表 es 内部节点或集群与客户端的交互方式,默认内部是使用 tcp 协议进行交互,同时它支持 http 协议(json 格式)、thrift、servlet、memcached、zeroMQ 等的传输协议(通过插件方式集成)。
感谢各位的阅读,以上就是“elasticsearch 分布式搜索怎么实现”的内容了,经过本文的学习后,相信大家对 elasticsearch 分布式搜索怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!