搜索系统7:索引查询方法与评价方法
2017-09-11 18:04
127 查看
一、 多条件的查询方法:
之前已经介绍过倒排索引的结构。在查单个词的时候比较简单,直接查从索引里找是否有这个词对应的文档列表就行了。但如果条件是and、or、not这样的条件,怎么处理呢?
and:对多个条件分别取文档列表后,再取交集。
or:对多个条件分别取文档列表后,再取并集。
not:对多个条件分别取文档列表后,再取补集。
曾经以为这样效率不高,但仔细想想。索引列表压缩后最多也就几mb的数据,这已经可存百万级的列表了,在内存中对几个几mb的数据遍历一下也要不了多少时间,更不用说可用二分等更高级的算法了,效率不是问题。
二、如何按相关性排序?
比如用户搜"秋季 瘦身",可先按上面or的处理方法取出并集,但这么多的文档怎么按相关性排序呢?如果索引里的值已经足够计算相关性,那么直接用索引里的值,不够再读取相应的文档。具体方法有一次一单词(Term at a Time)、一次一文档(Doc at aTime)、跳跃指针(Skip Pointers)。
三、多字段的索引怎么存储
1.每个字段做一个索引文件,如下
标题字段
描述字段
2.在字段信息存在索引里:
这个字段可以不用名称,可每个字段用一个比特位来表示。如总共有2个字段,则上对于"美容"这个词的值为Doc7(tf,idf)(11),doc8(tf,idf)(10),Doc6(tf,idf)(01)
3.扩展列表方式
对每个字段做一个扩展列表,如下:
标题字段扩展 {doc1,(1,4)},{doc2,(6,8)}
{doc1,(1,4)}的意思是文档1的标题所占的位置是1到4,其它类推。
那么倒排列表结构可这么存:
美容: [doc1,(6,8)], [doc2,(7)]
那么"美容"这个词在文档1的位置是6到8,并没有在上面的1到4里,就是说标题里没有"美容"这个词。同理"美容"这个词在文档2的标题里。
四、检索效果评价
1.精确率Pr
Pr=检索结果中与检索相关的结果数 / 全部检索结果数
如,在检索某个查询的答案时,取前50个文档。而且这35个文档是与查询相关的,则精确率为P50=70% 。为什么是这么计算,其实是有前提的:就是相关的才被查出来。这与我们的实际工作有些区别,有时我们要尽可能给用户提供更多的选择,相关也是有相关度的区别的。如果返回的前35个就是最相关的,而且除了这已经没有最相关的了,其它的是15个是次相关的,这个精确率就应该是100% 。
2.召回率Rr
Rr=与检索相关且实际检索出的文档数 / 与检索相关的文档数
还是前面那个例子,实际检索出的前50个文档中有35个是相关的,但是真正相关的有70篇,那么召回率R50=50%,因为在前50篇文档中只选出了35/70=50的相关文档。
一般在用ik这样的中文分词,如果单从词的匹配的角度来看,精确率应该都是100%。但如果从一个用户的观点看,可能在第10页的数据才是他认为是精准匹配的,所以这样的问题得具体问题具体分析,使用不同的算法来解决。
之前已经介绍过倒排索引的结构。在查单个词的时候比较简单,直接查从索引里找是否有这个词对应的文档列表就行了。但如果条件是and、or、not这样的条件,怎么处理呢?
and:对多个条件分别取文档列表后,再取交集。
or:对多个条件分别取文档列表后,再取并集。
not:对多个条件分别取文档列表后,再取补集。
曾经以为这样效率不高,但仔细想想。索引列表压缩后最多也就几mb的数据,这已经可存百万级的列表了,在内存中对几个几mb的数据遍历一下也要不了多少时间,更不用说可用二分等更高级的算法了,效率不是问题。
二、如何按相关性排序?
比如用户搜"秋季 瘦身",可先按上面or的处理方法取出并集,但这么多的文档怎么按相关性排序呢?如果索引里的值已经足够计算相关性,那么直接用索引里的值,不够再读取相应的文档。具体方法有一次一单词(Term at a Time)、一次一文档(Doc at aTime)、跳跃指针(Skip Pointers)。
三、多字段的索引怎么存储
1.每个字段做一个索引文件,如下
标题字段
描述字段
2.在字段信息存在索引里:
这个字段可以不用名称,可每个字段用一个比特位来表示。如总共有2个字段,则上对于"美容"这个词的值为Doc7(tf,idf)(11),doc8(tf,idf)(10),Doc6(tf,idf)(01)
3.扩展列表方式
对每个字段做一个扩展列表,如下:
标题字段扩展 {doc1,(1,4)},{doc2,(6,8)}
{doc1,(1,4)}的意思是文档1的标题所占的位置是1到4,其它类推。
那么倒排列表结构可这么存:
美容: [doc1,(6,8)], [doc2,(7)]
那么"美容"这个词在文档1的位置是6到8,并没有在上面的1到4里,就是说标题里没有"美容"这个词。同理"美容"这个词在文档2的标题里。
四、检索效果评价
1.精确率Pr
Pr=检索结果中与检索相关的结果数 / 全部检索结果数
如,在检索某个查询的答案时,取前50个文档。而且这35个文档是与查询相关的,则精确率为P50=70% 。为什么是这么计算,其实是有前提的:就是相关的才被查出来。这与我们的实际工作有些区别,有时我们要尽可能给用户提供更多的选择,相关也是有相关度的区别的。如果返回的前35个就是最相关的,而且除了这已经没有最相关的了,其它的是15个是次相关的,这个精确率就应该是100% 。
2.召回率Rr
Rr=与检索相关且实际检索出的文档数 / 与检索相关的文档数
还是前面那个例子,实际检索出的前50个文档中有35个是相关的,但是真正相关的有70篇,那么召回率R50=50%,因为在前50篇文档中只选出了35/70=50的相关文档。
一般在用ik这样的中文分词,如果单从词的匹配的角度来看,精确率应该都是100%。但如果从一个用户的观点看,可能在第10页的数据才是他认为是精准匹配的,所以这样的问题得具体问题具体分析,使用不同的算法来解决。
相关文章推荐
- 搜索系统7:索引查询方法与评价方法
- Graylog日志管理系统---搜索查询方法使用简介
- 保存信息时调用luceneDao中的save方法产生索引,搜索时调用search依据进行查询
- 测试淘宝站内的搜索系统,请问你能想到哪些方法来进行测试?
- LIB环境变量中指定的搜索路径:“C:/Program Files/Microsoft Visual Studio/VC98/mfc/lib 系统找不到找定的路径的解决方法
- python实现域名系统(DNS)正向查询的方法
- 在Linux系统中索引的方法
- Win10系统索引重建方法
- chm文件 索引和搜索不能用了的解决方法
- Spring mvc + mybatis web项目当系统启动时运行某方法查询数据库内容
- 基于Lucene.Net包装的傻瓜索引搜索系统
- Mysql查询索引和主键的方法的方法
- 查询Linux系统最后重启时间的三个方法
- XP系统的 搜索 功能失效;IE点击链接没反应,不会弹出窗口的解决方法
- solr4.0+IKAnalyzer 中文搜索,无法查询到结果的解决方法-【布尔逻辑和 空格后默认加默认搜索字段】
- 查询Linux系统最后重启时间的三个方法
- [推荐系统]mahout支持的对推荐引擎的评价方法
- MongoDB学习(3)(条件查询,排序,索引的方法)
- 门户系统中空间查询、地理搜索及联网查询
- Win8.1系统中开启或者关闭Bing在线搜索的方法