在现在互联网如日中天的时代,即使你不是互联网行业的人,你也一定会用过谷歌或者百度。因为他们已经影响了我们生活的方方面面,为我们提供了很多的便利。那么在互联网行业的人我们除了使用它们,我们还迫切地想知道它们到底是怎么实现的。
以谷歌和百度为例子。它们都称之为搜索引擎。虽然听起来比较高大上。但实际上他们就是搜索数据用的。但站在数据方面考虑,实际上数据会分为两种:结构化数据和非结构化数据。
- 结构化数据:简单来说,就是有固定格式固定长度的的数据。平常比较常见的例如Mysql、Oracle数据库等。
- 非结构化数据:反之,就是无固定格式和长度的数据。例如比较常见的是:Email和文档数据。
按照这两种数据的划分,他们在搜索上也有很大的不同。结构化数据我们可以建立数据库索引来快速的搜索数据。而非结构化的数据搜索。我们主要有两种方式。一种是顺序扫描法,另一种是全文搜索法。下面我们详细介绍一下这两种的区别。
- 顺序扫描法
顺序扫描法顾名思义,就是按照数据的顺序一步一步地找。找到一个然后就记录该位置。直到所有的数据都要扫描完,才知道要查找的内容都在哪些位置出现过。但这明显有相应的弊端。如果要查找的内容碰巧在数据的最后。那么该方法需要扫描所有的数据,但这之前扫描的数据均无效。这就造成了很大的资源浪费。
- 全⽂搜索法
既然我们已经知道顺序扫描法的弊端,那我们应该怎么进⾏优化呢?因为这样的数据是非结构化的数据。没有办法像结构化的数据做索引来达到快速检索的目的。那我们到底应该怎么办呢?答案很简单。逆向思维。既然非结构化的数据没办法做到,那我们把他们改成结构化的数据不就行了吗。这里改成结构化的数据,并不是将全部的数据都改成结构化。这样将毫无意义。而是将要搜索的内容按照某种方式,做成结构化的数据,然后将结构化的数据创建索引,接着我们在通过这些结构化的索引,来搜索相关非结构化的内容。这就是全⽂搜索的基本原理。
就像我们在淘宝搜索手机一样,淘宝并不会将所有的数据都按照结构化存储,而是将相应的关键字,按照结构化存储即可。这样当我们命中关键字时,就可以搜索出来我们想要内容。也正是因为这些,所以常常有些人在搜索的时候,喜欢输入很多的修饰词,适当的修饰词是可以准确地帮助我们,找到我们想要的内容,但如果修饰词过多的话,并不会达到我们想要的,因为他检索的本质是命中关键词。这也就是为什么有时我们搜索时,明明加了很多修饰词,居然和我们没有加修饰词搜索出来的内容是一样的原因。
所以谷歌和百度搜索引擎的基本原理就是:网络机器人或者网络蜘蛛通过扫描网页中的内容,提取出相应的关键词,然后为提取出的关键词建⽴索引,并记录该关键词在文章中位置,当用户搜索时,如果命中该关键词,搜索引擎就根据按照之前的索引进查找,这样可以很快的返回用户想要的数据内容。
下面我们介绍一下现在比较常见的搜索引擎,并介绍详细介绍一下它们之间的区别。
- Lucene:它归属于Apache软件基金会。它是一个全文检索引擎工具包,所以它并不是一个全文检索引擎。既然是工具包,所以它提供了强大的API功能例如:
- 可扩展的⾼高性能索引
- 强⼤大,准确,⾼高效的搜索算法
- 跨平台解决⽅方案
由于它只是一个全文检索引擎工具包,所以在使用时,需要我们自行编码。虽然现在也支持了多种语言,但最成熟的开源版本,还是Java。所以要想使用它,我们需要Java的编程基础。
- Solr:它是一个独立的企业级搜索应用服务器,Solr是基于Lucene的Java库构建的开源搜索平台。并提供了HTTP的方式,创建索引和查询数据。除此之外,它还提供了以下比较高级的功能:
- 全⽂文搜索
- 分⾯面搜索
- 实时索引
- 动态群集
- Elasticsearch:它也是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch也是用Java语言开发的。它和Solr一样,除了基本的数据检索功能外,也提供了以下高级的功能:
- 分布式搜索
- 数据分析
- 分组和聚合
下面我们介绍一下,为什么会出现搜索引擎技术,而不是用传统的数据库去实现此功能。
我们知道如果采用传统的数据库,我们可能通过创建索引的方式,去优化我们的查询速度。并且,我们还知道,如果在数据量比较大的话,还可以采用分库分表的方式继续优化。那为什么还会出现类似Elasticsearch这样的搜索引擎技术呢?答案就像我上面介绍的那样。搜索引擎并不会将所有的数据全部按照结构化存储,而是按照相应的关键字存储。并且按照现在的网页数据,不同的网站,内容大不相同,如果采用结构化存储,那么在数据库设计上很难实现。除此之外,我们知道,在数据库中要想快速的查询数据,那么必须要创建相应的索引,但我们在使用SQL语法时,尝尝会因为我们使用不当,或者某些特定的方式,命中不到索引,这就导致使用数据库检索时,会比较慢。比较常见的就是。例如我们在数据库中搜索指定的关键字,并且该关键字的字段我们创建了索引,所以在搜索时,查询的速度很快,因为它命中了索引。但在实际的应用场景中,我们并不会正好输入的关键字就是数据库中存储的,而是采用的是模糊搜索的方式。而在数据库中要想使用模糊搜索,则要使用like关键字。但在使用like关键字时,则索引会失效。除此之外,我们在数据库中创建索引时,并不是越多越好。因为如果索引过多的话,则会影响inster和update的性能。所以,正是因为数据库有种种这样的原因,才会出现全文搜索引擎存在的必要。
下面我们介绍一下全文搜索引擎比较适合的应用场景都有哪些:
- 搜索数据比较大的非结构化数据。
- 支持文本数据量达百万级别。
- 支持交互式⽂文本的查询。
- 对写需求比较少的需求,因为全文检索的核心目的就是查询。
以上内容就是本篇的全部内容,在接下来的文章中,我们将重点更新有关Elasticsearch相关的内容,欢迎大家支持,谢谢。