在搜索查询领域,传统的数据库的基于B树的正向索引的like查询方式在大数据量查询面前有较高的延迟和性能消耗,而且对于实时检索方面的应用场景不能很好的胜任,比如日志实时检索,电商的商品检索,网站的站内检索等,全文检索技术的出现很好的解决了以上应用场景需要解决的问题,目前在java这块,已经有很成熟的引擎Lucene,Lucene是apache软件基金会的一个子项目,它是一套用于全文检索和搜寻的开源程式库,并且提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻,关键是它还是一个成熟和免费的开源工具,目前在Lucene引擎上构建的2个比较有知名度的就是Elasticsearch与Solr。
在全文检索的普及观念来解析的话,它是从文本或数据库中,不限定数据字段,自由地萃取出消息的技术。通过对文本的非结构化数据利用分词技术和倒排索引来完成。这里就有个很重要的概念就是倒排索引。
笔者从很多的技术资料文献和网上的技术博客去查看了对倒排索引的相关的概念描述,有的资料书堆砌概念使倒排索引概念变得模糊不清,这类的介绍也是卷帙浩繁,今天希望通过本文极简的描述来阐述着个概念。
倒排索引其实是文档检索系统里面的一种最常用的数据结构,面对GB和TB级别的文本数据,全文检索一般都会利用分词插件将文本先进行分词,将分词后的词语为索引的单位建立映射关系,分词后的词作为键,而这个分词在文档中出现的位置则作为值,建立映射关系后当遇到搜索请求后,则
按搜索请求中的词作为搜索条件去搜索对应分词键所对应的文档位置,然后再进行文档位置的集合进行交集运算等最后得出搜索结果,在搜索的过程中会用到二分查找算法,所以整个检索效率还是非常高的。下面就进行举例说明:
以英文为例,下面是要被索引的文本:
T_0="it is what it is"
T_1="what is it"
T_2="it is a apple"
一、一条记录的水平反向索引(主要反应单词被引用的文档列表,定位文档在哪);
根据分词插件,我们可以将以上的进行分词得到"a", "banana", "is", "it", "what"然后再根据分词建立键,再将分词在文本出出现的位置进行记录(Map方式),下面我们就可以得到下面的反向文件索引:
如果此时我们检索的是"what is it",则我们可以根据分词键找到对应的集合what -> , is -> , it ->
可以得到对应的集合{ n n = 即检索的结果是T_0和T_1。
二、一个单词的水平反向索引(主要反应单词在文档中的位置,定位单词在文档中的位置)
这种方式比第一种要细化(Map>)方式。这种反向索引的形式如下,接着延伸上面的例子:
"a": {(2, 2)}
"apple": {(2, 3)}
"is": {(0, 1), (0, 4), (1, 1), (2, 1)}
"it": {(0, 0), (0, 3), (1, 2), (2, 0)}
"what": {(0, 2), (1, 0)}
如果我们执行短语搜索"what is it" 我们得到这个短语的全部单词各自的结果所在文档为T_0和T_1。但是这个短语检索的连续的条件仅仅在T_1得到。
领取专属 10元无门槛券
私享最新 技术干货