先简单介绍一下ElasticSearch。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题以及可能出现的更多其它问题。(摘自百度百科)。
ElasticSearch的全文检索效率之所以比数据库要高,是因为ElasticSearch使用了一种叫做倒排索引的索引方式。下面对倒排索引的原理做简单说明。
现在我有两个字符串:
语句一:The quick brown fox jumped over the lazy dog
语句二:Quick brown foxes leap over lazy dogs in summer
创建倒排索引的时候,我们将每一个串拆成一连串的词语(term),就想下面这样。
term | 语句一 | 语句二 |
---|---|---|
Quick | √ | |
The | √ | |
brown | √ | √ |
dog | √ | |
dogs | √ | |
fox | √ | |
foxes | √ | |
in | √ | |
jumped | √ | |
lazy | √ | √ |
leap | √ | |
over | √ | √ |
quick | √ | |
summer | √ | |
the | √ |
现在我们想要搜索quick brown,我们只需要查看quick和brown两个term就可以了。
term | 语句一 | 语句二 |
---|---|---|
brown | √ | √ |
quick | √ | |
Total | 2 | 1 |
我们由此找到了包含quick和brown的语句。语句一种quick和brown都包含,语句二种只包含brown。因此语句一的匹配度更高一些。如果我们使用关系型数据库来查询,那么查询会非常复杂,需要使用like关键字,这样就会导致一行一行的扫描数据,性能不高。
当然倒排索引不想上面说的这么简单,但是大体上的原理就是这样。
如果这个时候我想要查询 Quick fox,那么我们不会得到任何的搜索结果。因为没有任何一个语句同时包含Quick和fox。因为quick不等同于Quick,fox不等同于foxes。其实elastic为我们提供了很多的分词器,这个时候你可以指定一个分词器来满足要求。你可以使用不同的分词器来对语句进行划分,甚至自己定制分词器来满足自己的需要。