ES(ElasticSearch)搜索
1、ES简介
ElasticSearch是一个基于Lucene的实时的分布式搜索和分析引擎。设计用于云计算中能够达到实时搜索,稳定可靠,快速,安装使用方便。基于RESTFUL接口。
2、原理
ES使用了倒排索引(inverted index),该结构对于全文检索非常快。
倒排索引包括一个在任意文档中出现的唯一性的词语列表,对于每个词语,都有一个它出现过的文档列表。
如下图所示:
Doc_1:
The quick brown fox jumped over the lazy dog
Doc_2:
Quick brown foxed leap over lazy dogs in summer
现在我们查询quick brown(注意,quick是小写),我们只需要知道这个词在哪些文档出现过:
如果我们使用简单的相似性算法,比如说将每个文档匹配的词语数相加,我们就能看出来第一个文档更加匹配,比第二个文档更加符合我们的查询条件:quick brown。
但是我们当前的倒排索引有几个问题:
1、Quick和quick作为不同的词语出现,用户可能认为它们相同。
2、fox和foxes也很相似,就像dog和gods一样。
3、jumped和leap虽然看起来不一样,但是是同义词
针对这个问题,处理的方法是进行算法优化。如Quick全小写,则和quick一样。还有复数转原型,如dogs转成dog。同义词合并,如 jumped和leap可以合并成jump等优化。
进行分词和同义词等操作称为“分析”。
进行分析后可以按照搜索关键词出现的频率进行倒序排列,将结果返回。
但是,如果这样返回的话存在一个问题,那就是如果关键词在两个文档中都存在怎么办。比如“dog”在Doc_1和Doc_2中都出现过,怎么确定Doc_1和Doc_2的返回顺序呢?处理的方法是,在算法中增加每个关键词的权重,同一个关键词在不同的文档中对文档的关键程度是不同的。权重大的可以看做更符合用户所查询内容,优先返回。
以上,就是我所理解的倒排索引,如有不对,请指正。
3、ES基本概念
- 索引(Index)
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。相对于关系型数据库来说,索引类似SQL中的数据库(database),或者一个数据存储方案(Schema)。
- 类型(Type)
类型是索引内部的逻辑分区,然而其意义完全取决于用户需求。因此,一个索引内部可以定义多个类型。类型类似SQL中的表(tables)。
文档(Document)
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于json格式进行表示。 文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。
- 映射(Mapping)
ES中,所有的文档在存储之前都要进行分析,用户可根据需要定义如何将文本分割成token、那些token应该被过滤掉,以及那些文本需要进行额外处理等待。
- 集群(Cluster)
ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。
多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。
集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。
如果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。
- 节点(Node)
运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。
类似于集群,节点靠其名称进行标识,默认为启动时自动生成的随机Marvel字符名称。
用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。
节点通过为其配置的ES集群名称确定其所要加入的集群。
- 分片(Shard)和副本(Replica)
ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。
每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。
Shard有两种类型:primary和replica,即主shard及副本shard。
Primary shard用于文档存储,每个新的索引会自动创建5个 Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。
Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。
每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。
ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。
ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。
4、RESTful接口
前文说过,ES是基于RESTful接口的。
REST的操作分为以下几种:
get:获取对象的当前状态。类似SQL中的select。
put:改变对象的状态,如果没有对象则创建。类似SQL中的updata。
post:创建对象。类似SQL中的insert。
delete:删除兑现。类似SQL中的delete。