Elasticsearch(二) Elasticsearch简介及核心概念倒排索引
一. 我到底能够使用 Elasticsearch 做什么?
通过 Elasticsearch,您能够执行及合并多种类型的搜索(结构化数据、非结构化数据、地理位置、指标),搜索方式随心而变。先从一个简单的问题出发,试试看能够从中发现些什么。 作为一个分布式搜索服务
1. 它可以进行快速进行全文搜索
2. 可扩展性: 支持PB级别数据的存储,以及成百上千的集群
3. 大数据处理, 数十亿行日志的聚合处理
4. 通过相关度(_score)对所有内容搜索
基于各项元素(从词频或新近度到热门度等)对搜索结果进行排序。将这些内容与功能进行混搭,以优化向用户显示结果的方式。
5. 弹性处理. 故障转移, 跨集群复制
二. Elasticsearch数据结构
我们通过与MySQL的对比, 来快速了解Elasticsearch数据架构
如图所示:
1. 其中数据库对应ES中的Index(索引库)
2. 而Table对应Type, 7.8以后'type'概念删除了, 可以理解一个Index库只存储一个种类型的数据
3. 数据库中的一条记录 => ES中的一个文档记录document
4. 数据库表中的字段 => ES 中的Field字段
5. 数据库表中的字段类型映射 => ES中的mapping映射
三. 倒排索引
Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
很难理解对吧, 这里博主引入了实际场景来进行解释:
假设我们MySQL 有两条记录,对应ES中的两个文档,每个记录的 content
字段包含如下内容:
doc1: 天空中有只小鸟
doc2: 天空中有只大雁
为了创建倒排索引,我们首先将每个文档的 content
字段(通过分词器,分析器)拆分成单独的词(我们称它为 词条
或 tokens
),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:
Term(分词) Doc_1 Doc_2 ------------------------- 天空 | X | X 小鸟 | X | 大雁 | | X ------------------------
现在,如果我们想搜索 天空小鸟 ,我们只需要查找包含每个词条的文档:
Term Doc_1 Doc_2 ------------------------- 天空 | X | X 小鸟 | X | ------------------------ Total | 2 | 1
两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单 相似性算法 ,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。
注意:
分词器在进行分词的时候会将所有的单词进行小写, 例如字段内容中包含的 Hello 会在 ES存储的时候分词为 hello, 所以进行term完全匹配搜索的时候必须使用小写, 当然进行全文匹配match时候则没有关系, 这个搜索我们后面的博文中会详细说明