一. Elasticsearch简介
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API
来隐藏Lucene的复杂性,从而让全文搜索变得简单。
二. 人物介绍
在他待业阶段,跟随着想学习厨师的新婚妻子到达伦敦,便想为妻子开发一个可以搜索食谱的应用,于是便接触了lucene,经过不断的研发,诞生了他的第一款产品 “Compass”。后来产品更名为Elasticsearch,代码托管在github上,Shay Banon自己也说过他的产品的成功关键是源于开源,外加除了搜索之外的其他的用例。Shay Banon于2012年成立Elastic公司,公司与2018年上市,但是迄今为止好像还是没有为他的妻子做出搜索菜谱的应用,估计也用不上了吧。
提到目前几乎所有的开源搜索引擎,都不得不提这个人Dog cutting. 他是Lucene的项目发起人,同样也是当今在大数据和云计算领域如日中天的Hadoop的创始人。
三.正向索引以及倒排索引
正向索引与倒排索引,这是在搜索领域中非常重要的两个名词,正向索引通常用于数据库中,在搜索引擎领域使用的最多的就是倒排索引,我们根据如下两个网页来对这两个概念进行阐述:
我爱我的祖国,我爱编程
我爱编程,我是个快乐的小码农
3.1 正向索引
假设我们使用mysql的全文检索,会对如上两句话分别进行分词处理,所谓的分词,就是将一句话按照中文的语义拆分成字或者词,然后将没有太多含义的字去掉(例如: 的、得、了、嗯等这类词), 那么大概会得到的结果如下(当然还有每个词或字的词频和出现的位置,为了方便理解,我只是把词或字列出来):
我 爱 爱我 祖国 我的祖国 编程 我爱编程
我 我爱 爱 编程 爱编程 我爱编程 快乐 码农 小码农
假设我们现在使用正向索引搜索 编程
这个词,那么会到第一句话所有分词中查找是否包含有 编程
这个关键词,如果有则加入到结果集中;第二句话也是如此。假设现在有100万个网页,每次查询都会到这100万个网页所产生的分词,到那么搜索的效率将会非常非常低些。
3.2 倒排索引
倒排索引是按照分词与文档进行映射,我们来看看如果按照倒排索引的效果:
关键词 | 文档名 |
---|---|
我 | html1,html2 |
爱 | html1,html2 |
爱我 | html1 |
我爱 | html2 |
祖国 | html1 |
我的祖国 | html1 |
编程 | html1,html2 |
我爱编程 | html1,html2 |
爱编程 | html1,html2 |
快乐 | html2 |
码农 | html2 |
小码农 | html2 |
如果采用倒排索引的方式搜索 编程
这个词,那么会直接找到关键词中查找到 编程
,然后查找到对应的文档,这就是所谓的倒排索引。