一 .简介
(1) 一切设计都是为了提高搜索的性能
(2) 是一个基于Lucene构建的开源、分布式、RESTful的全文本搜索引擎
(3) 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索
(4) 可以扩展到上百台服务器,达到扩容效果,添加更多节点;处理PB级别的结构化或非结构化数据
(5) 面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式
二 .概念
1.索引(index)
一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方,并通过引用此名称完成文档的创建、搜索、更新及删除操作
2.类型(type)
类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求;一般来说,类型就是为那些拥有相同的域的文档做的预定义
3.文档(document)
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示;文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”,文档中,域的数据存储时支持“string”、“numbers”、“Booleans”和“dates”几种类型,不同类型的数据在索引时是略有区别的。在 Elasticsearch 中文档是 不可改变 的,不能修改它们。
4.映射(mapping)
所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等;ES还提供了额外功能,例如将域中的内容按需排序
5.集群(cluster)
ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力,多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群
6.节点(node)
运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索,操作节点通过为其配置的ES集群名称确定其所要加入的集群,用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性可以将请求发送到集群中的任何节点,包括主节点。每个节点都知道任意文档所处的位置,并且能够将请求直接转发到存储我们所需文档的节点
7.分片(shared)和副本(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,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能
三 . 数据查询
Query API是ElasticSearch的API中较大的一部分,基于Query DSL(JSON based language for building complex queries),可完成诸多类型查询操作,
查询执行过程通常要分成两个阶段,分散阶段及合并阶段;分散阶段是向所查询的索引中的所有shard发起执行查询的过程,合并阶段是将各shard返回的结果合并、排序并响应给客户端的过程
向ElasticSearch发起查询操作有两种方式:一是通过RESTful request API传递查询参数,也称“query-string”;另一个是通过发送REST request body,也称作JSON格式
向ElasticSearch发起查询操作有两种方式:一是通过RESTful request API传递查询参数,也称“query-string”;另一个是通过发送REST request body,也称作JSON格式。
(1) 空搜索 GET /_search
hits:返回结果中最重要的部分,在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段
took:执行整个搜索请求耗费了多少毫秒
shards: 查询中参与分片的总数,已经这些分片成功了多少失败了多少
(2) 多索引,多类型
/_search 在所有的索引中搜索所有的类型
/gb/_search 在 gb 索引中搜索所有的类型
/gb,us/_search 在 gb 和 us 索引中搜索所有的文档
/g*,u*/_search 在任何以 g 或者 u 开头的索引中搜索所有的类型
/gb/user/_search 在 gb 索引中搜索 user 类型
/gb,us/user,tweet/_search 在 gb 和 us 索引中搜索 user 和 tweet 类型
/_all/user,tweet/_search 在所有的索引中搜索 user 和 tweet 类型
(3) .查询表达式
match_all:查询简单的,匹配所有文档,在没有指定查询方式时,它是默认的查询
match:全文搜索+精确查询,在执行查询前,它将用正确的分析器去分析查询字符串
multi_match :在多个字段上执行相同的match语句
range:查询找出落在指定区间的数字或时间
term:精确值匹配,查询对于输入的文本不分析,所以它将给定的值进行精确查询
terms: 查询和term一样,允许多值进行匹配
exists:指定字段的值是否存在
missing :指定字段的值是否没有
(4) .合并查询语句
bool : 将多查询组合在一起
must: 文档 必须 匹配这些条件才能被包含进来。
must_not:文档必须不匹配这些条件才可以被包含进来
Should: 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分
filter: 必须匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档
在实际开发过程中,会根据不同的业务,会出现各种不同程度的查询语句和组合语句
四.倒排索引
倒排索引是搜索引擎的核心,主要作用快速搜索;在搜索引擎中,每个文档都有一个对应的文档ID,文档内容被表示为一系列关键词的集合
参考文档:elasticsearch 权威指南