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


文章1的内容为: Jack lives in BeiJing,I live in BeiJing too. 文章2的内容为: He lived in Taiyuan.
1)取得关键词
首先我们要用我们之前讲的方式分词,然后由于英文的原因,我们需要将in、on、of这些没用实际意义的词过滤掉,然后将第三人称单数加s或者过去式加ed这些词还原回去,如lived变回live,lives变回live,然后把不需要的标点符号也去掉 。经过上面的处理之后,剩下的关键字为:
文章1的所有关键词为:[Jack] [live] [BeiJing] [i] [live] [BeiJing]
文章2的所有关键词为:[he] [live] [Taiyuan]
2)建立倒排索引
关键词 文章号[出现频率] 出现位置BeiJing 1[2] 3,6he 2[1] 1i 1[1] 4live 1[2] 2,5,2[1] 2Taiyuan 2[1] 3tom 1[1] 1 以上就是lucene索引结构中最核心的部分 。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词 。
3.3 实现
实现时,lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存 。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息 。
3.4 压缩算法
为了减小索引文件的大小,Lucene对索引还使用了压缩技术 。
首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语> 。
其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数) 。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节) 。
3.5 使用原因
假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果 。词典通常非常小,因而,整个过程的时间是毫秒级的 。
而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的 。
四、solr基本配置以及使用
我们在windows系统中安装solr 。
下载地址 http://lucene.Apache.org/solr/downloads.html
解压后:

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

文章插图
 
cmd 进入solr的bin目录,使用命令 solr start(为了更方便,可以配置solr的环境变量,配好后可以直接在cmd中使用solr命名)
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
看到这个界面,说明solr服务启动成功,端口号为 8983,访问 http://localhost:8983,会自动跳转到http://localhost:8983/solr/#/
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
在这个页面会显示 solr的基本信息,lucene信息,Java信息等
然后我们介绍一个solr的指令: solr -h 可以看到solr的基本信息
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
配置solr
配置核心core
solr create -c mycore -d baisc_configs:-c参数指定定义的核心名称,-d参数指定配置目录
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
执行该命令后,会多出一个test目录 。
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
访问Solr Admin页面:http://localhost:8983/,查看core,多了一个 test
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
在solr-6.3.0serversolrtest目录下有conf和data目录,分别对应配置和数据 。
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
给core添加数据
打开目录:solr-6.3.0serversolrtestconf,添加一个字段:
<field name="name" type="string" indexed="false" stored="true" required="true" multiValued="false" />然后重启solr: solr restart -p 8983
Java基于Solr海量数据搜索,搜索引擎的实现

文章插图
 
到Solr Admin页面,选择core-test-document,在Document(s)中填写数据:
{"id":"1","name":"宝马"}点击submit,返回Status: success,则代表添加数据成功 。


推荐阅读