搜索系统2:倒排索引

倒排索引可以说是lucene的核心,也就是我介绍的搜索系统的核心。所有数据的存储都是用的这种结构。例如需要索引的文档如下:


对于上面的每行文档的txt字段,都可能被搜索。那么lucene是怎么做的呢?首先使用中文分词将文档切成单词序列(terms),lucene会给每个单词一个编号 ,同时记录那些文档包含了这个词。比如:养生这个词编号为1,那么倒排列表为{1,4}。根据中文分词的不同可能分出来的词不同,可能最后形成这样的文件(省略了很多词):


当然真正的索引文件比这个复杂些,它还会记录tf(词频),idf(文档频率),position(单词位置 )等。

tf:该词在本文档中出现了几次。
idf:该词在全部文档中的多个个文档出现过。
position:该词在本文档的那些位置出现过。

关于这几个值在后面查询按相关度排序时都会用到。但是在电商行业并不一定会用到,比如tf,不能说商家把作品的名称里多放几个"养生",用户搜"养生"时这个作品就排到最前面吧?所以不能按lucene默认的排序方式来排序,需要定制各行业特有的相关性计算公式。这个后面再聊。

有很多人推荐查看索引的工具luke,个人认为这并不好用,看不出太多有用的信息。


知道了倒排索引,我们再把它与mysql的常用索引结构b-tree与hash相比就知道为什么数据库干不了这活了。这两索引结构天生就不支持查字段中的一部分词,要查就是全部遍历。当然mysql也可以用全文索引,我没用过这,但想想应该比较复杂,mysql怎么支持分词呢?

好了,在了解了基本结构后,后面再分析查询会容易得多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值