Java基于Solr海量数据搜索,搜索引擎的实现

我们平常的生活工作中,百度、谷歌这些搜索网站已经成为了我们受教解惑的学校,俗话说得好,“有问题找度娘” 。那么百度是如何在海量数据中找到自己需要的数据呢?为什么它搜索的速度如此之快?我们都知道是因为百度的搜索引擎,那么搜索引擎到底是个什么东西呢?可能有的程序员会想到es,但是es并不能代表搜索引擎,它只是其中的一种工具,不过这种工具确实好用,效率很高 。本文会向大家讲述搜索引擎的基本知识以及中文分词的一些方法、然后会做一个小的demo来尝试数据检索 。让大家初步了解搜索引擎的实现 。
一、搜索引擎介绍
1.1 搜索引擎是什么
这里引用百度百科的介绍:

搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统 。
1.2 搜索引擎分类
搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等 。
本文主要介绍全文索引,即百度使用的搜索引擎分类 。
全文索引
首先是数据库中数据的搜集,搜索引擎的自动信息搜集功能分两种:
  • 一种是定期搜索,即每隔一段时间(比如google一般是28天),搜索引擎主动派出“蜘蛛”程序,对一定IP地址范围内的互联网网站进行检索,一旦发现新的网站,它会自动提取网站的信息和网址加入自己的数据库 。
  • 另一种是提交网站搜索,即网站拥有者主动向搜索引擎提交网址,它在一定时间内(2天到数月不等)定向向你的网站派出“蜘蛛”程序,扫描你的网站并将有关信息存入数据库,以备用户查询 。
当用户以关键词查找信息时,搜索引擎会在数据库中进行搜寻,如果找到与用户要求内容相符的网站,便采用特殊的算法——通常根据网页中关键词的匹配程度、出现的位置、频次、链接质量——计算出各网页的相关度及排名等级,然后根据关联度高低,按顺序将这些网页链接返回给用户 。这种引擎的特点是搜全率比较高 。
1.3 搜索引擎能解决什么问题
  • 高效查询数据(运用多种算法查询数据,查询速率是毫秒级别,无论是千万条数据还是上亿的数据)
  • 比较容易,将普通的数据库切换成搜索引擎比较容易 。
  • 大数据量、时效性、高并发等等 。
1.4 搜索引擎的应用场景
  • 数据库达到百万数据级别的时候
  • 要求检索时效性、性能要求高,Ms级响应
1.5 Solr
接下来看在平常的互联网中搜索引擎的应用Solr 。那么什么是Solr呢?它和es相比有什么优点和不足呢?
我们先来简单地介绍一下solr:
Solr是一个基于Lucene的全文搜索服务器 。同时对其进行了扩展,提供了比Lucene更为丰富的面向使用的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面 。它支持Xml/Http协议,支持JSONAPI接口 。
它具有如下特点:
  • 可扩展性:Solr可以把建立索引和查询处理的运算分布到一个集群内的多台服务器上 。
  • 快速部署:Solr是开源软件,安装和配置都很方便,可以根据安装包内的Sample配置直接上手,可分为单机和集群模式 。
  • 海量数据:Solr是针对亿级以上的海量数据处理而设计的,可以很好地处理海量数据检索 。
  • 优化的搜索功能:Solr搜索速度够快,对于复杂的搜索查询Solr可以做到毫秒级的处理,通常,几十毫秒就能处理完一次复杂查询 。
二、分词介绍
接下来,我们将了解分词是如何实现的 。那么,我们为什么要去分词呢,这和搜索引擎有什么关系呢?我们在搜索框里输入的几个词或者一段话是如何拆成多个关键字的呢?
大家听说过哪些分词器吗?比如lucene自带的中文分词器smartcn,还有最常用的IK分词器等等,今天我们主要讲一下IK分词器 。
2.1 IK分词器
IK分词器首先会维护几个词典来记录一些常用的词,如主词表:main2012.dic、量词表quantifier.dic、停用词stopword.dic 。
Dictionary为字典管理类中,分别加载了这个词典到内存结构中 。具体的字典代码,位于org.wltea.analyzer.dic.DictSegment 。这个类实现了一个分词器的一个核心数据结构,即Tire Tree 。
Tire Tree(字典树)是一种结构相当简单的树型结构,用于构建词典,通过前缀字符逐一比较对方式,快速查找词,所以有时也称为前缀树 。具体的例子如下 。


推荐阅读