Lucene基础

一. 概述

全文搜索引擎
倒排文件索引结构

二. 倒排文件索引算法

第一步:全文分析关键词
由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施

  • a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的需要特殊的分词处理。
  • b.文章中的”in”, “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉
  • c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
  • d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
  • e.文章中的标点符号通常不表示某种概念,也可以过滤掉
    在lucene中以上措施由Analyzer类完成
    经过上面处理后
文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou] 
文章2的所有关键词为:[he] [live] [shanghai]

第二部:倒排索引
上面的对应关系是:“文章号”对“文章中所有关键词”
倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。
排序后变成:

关键词 		文章号
guangzhou 	1 
he 			2 
i 			1 
live 		1,2 
shanghai	2 
tom 		1

仅知道关键词在哪些文章中出现还不够,还需要知道关键词在文章中出现的次数和位置;
位置:

  • 字符位置:记录该词是文章中第几个字符(关键词定位)
  • 关键词位置:即记录该词是文章中第几个关键词(节约索引空间、词组(phase)查询快)
    lucene中记录的是关键词位置;
    处理后,索引结构变为:
关键词		 文章号	 	[出现频率]	 出现位置
guangzhou	 1	 		[2]			 3,6
he	 		 2	 		[1]	 		 1
i			 1	 		[1]			 4
live		 1	 		[2]			 2,5
			 2			[1]	 		 2
shanghai	 2	 		[1]	 		 3
tom			 1			[1]			 1

关键词按字符顺序排列,使用二分法定位
将上面内容分成三个文件:
词典文件(Term Dictionary):保存指向频率文件和位置文件的指针+field
频率文件(frequencies):文章号+频率
位置文件 (positions)

field:表达信息所在位置(如标题中,文章中,url中),每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)

索引压缩
关键词压缩:
<前缀长度,后缀>
例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>

数字压缩:
数字只保存与上一个值的差值
例如:当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)

索引查询
查找'live'
先对词典二元查找,通过指向频率文件的指针读出所有文章号,然后返回结果。

三. 全文检索框架的实现机制

http://www.open-open.com/lib/view/open1410492056742.html
http://blog.csdn.net/tlqfreedom/article/details/49255651
http://blog.csdn.net/july_2/article/details/24481935
http://www.icoolxue.com/album/show/16
http://www.open-open.com/lib/view/open1348219378948.html
http://www.open-open.com/lib/view/open1322894601968.html
http://www.open-open.com/lib/view/open1331275900374.html

posted @ 2016-09-14 15:54  zhangshihai1232  阅读(107)  评论(0)    收藏  举报