一.从古诗谈起
诗词飞花令为什么难? 因为我们大脑中建立的索引往往是“静夜思”--->"床前明月光。。。。"
飞花令规则逆向思维,我们尝试建立“月”-->"床前明月光。。。。"这样的索引,这样所有带月的诗句我们很快就能检索出来。我们称这样的索引为倒排索引或者反向索引。
更近一步地,我们改进成索引矩阵:
“前”--->"静夜思,望庐山瀑布",“月”--->"静夜思,月下独酌"
通过诗名索引到诗句,这样可以大大减少所需的存储空间。
二.引出搜索引擎
其实不难看出,上面所说的原理与我们的谷歌、百度等搜索引擎的逻辑相似,只不过搜索引擎的流程稍微复杂一点,还包括网页爬取,停顿词过滤等,但是核心都是建立倒排索引。
【停顿词】:常见的“的”,“而”,“了”等,没有实际意义,所以建立索引时不考虑这些词。
三.Elasticsearch
Elasticsearch 在Lucene基础上发展而来,Elasticsearch 将对搜索引擎的操作全部封装成restful风格的api,通过http请求就能对其进行操作。同时,Elasticsearch 还考虑到了海量数据,实现了分布式,是一个可以存储海量数据的分布式搜索引擎。
Elasticsearch 相关概念:
【索引】-------------------对应MySql中的数据库,拿来存放数据的地方
【类型】-------------------对应MySql中的一张表,用来定义数据结构的
【文档】-------------------文档就是最终的数据了,你可以认为一个文档就是一条记录。
依旧回到古诗的例子中,我们可以定义一个poems的索引,然后定义类型poem{
title:{type:“keyword”};
author:{type:“keyword”};
content:{type:“text”};
},然后文档将古诗按照上面的格式存入。
{
title:“静夜思”;
author:“李白”;
context:“窗前明月光。。。”
}
{
title:“望庐山瀑布”;
author:“李白”;
context:“。。遥望瀑布挂前川。。。”
}
{
title:“月下独酌”;
author:“李白”;
context:“。。。举杯邀明月。。”
}
Elasticsearch 会建立类似的索引:
key value
“前” “静夜思”,“望庐山瀑布”
“月” “静夜思”,“月下独酌”
。。。。。
keyword和text都是表示字符串,Keyword 类型是不会分词的,直接根据字符串内容建立反向索引,Text
类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立反向索引。
这样,再当我们搜索带有“前”、“月”。。这类关键词时,Elasticsearch 会很快检索到对应的古诗和诗句。
四.Elasticsearch 分布式
海量数据情况下,Elasticsearch 会对数据进行切分,同时每一个分片会保存多个副本,其原因和 HDFS 是一样的,都是为了保证分布式环境下的高可用。比如分片一存储到1、2、4块数据,分片二存储到了2、3、4块数据,分片三存储到了1,3块数据。
在 Elasticsearch 中,节点是对等的,节点间会通过自己的一些规则选取集群的 Master,Master 会负责集群状态信息的改变,并同步给其他节点。注意,只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以 Route 到集群中的任意节点,所以数据写入压力是分散在整个集群的。
五.Elasticsearch的其他应用
ELK分布式日志收集。
下一篇将简单介绍一下倒排索引的实现和B+索引的比较。