elasticsearch倒排索引

先简单介绍一下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为我们提供了很多的分词器,这个时候你可以指定一个分词器来满足要求。你可以使用不同的分词器来对语句进行划分,甚至自己定制分词器来满足自己的需要。

你可能感兴趣的:(ElasticSearch,技术博客)