搜索系统7:索引查询方法与评价方法

一、 多条件的查询方法:

之前已经介绍过倒排索引的结构。在查单个词的时候比较简单,直接查从索引里找是否有这个词对应的文档列表就行了。但如果条件是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页的数据才是他认为是精准匹配的,所以这样的问题得具体问题具体分析,使用不同的算法来解决。

时间: 2024-10-10 01:31:22

搜索系统7:索引查询方法与评价方法的相关文章

下载Lucene4.X实战类baidu搜索的大型文档海量搜索系统(分词、过滤、排序、索引)

Lucene是一个高性能.可伸缩的信息搜索(IR)库.目前最新版本是4.3.1. 它可以为你的应用程序添加索引和搜索能力.Lucene是用java实现的.成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License].同样,Lucene是当前非常流行的.免费的Java信息搜索(IR)库. Lucene4.X实战类baidu搜索的大型文档海量搜索系统(分词.过滤.排序.索引),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:htt

详谈京东的商品搜索系统架构设计

京东商品搜索引擎是搜索推荐部自主研发的商品搜索引擎,主要功能是为海量京东用户提供精准.快速的购物体验.虽然只有短短几年的时间,我们的搜索引擎已经经过了多次618店庆和双11的考验,目前已经能够与人们日常使用的如谷歌.百度等全文搜索引擎相比,我们的产品与其有相通之处,比如涵盖亿级别商品的海量数据.支持短时超高并发查询.又有自己的业务特点: 海量的数据,亿级别的商品量: 高并发查询,日PV过亿: 请求需要快速响应. 搜索已经成为我们日常不可或缺的应用,很难想象没有了Google.百度等搜索引擎,互联

提高数据库查询效率的有效方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放

如何采用 coreseek(sphinx) 搭建搜索系统

coreseek 实战总结 该文章包含以下内容: coreseek 的典型架构 实时性解决方案 mmseg 分词使用经验 同义词使用经验 后继目标 coreseek 的典型架构 coreseek 的典型结构,就是通过增量索引来满足近似实时性,对于新增的记录无法及时搜索可见.对于搜索系统存在的记录,非字符串字段的更新,我们一般是调用update方法进行更新.如果搜索引擎要返回业务的其他字段,这时字段的实时性是要求准实时的.这种情况在典型架构下,是可以解决的,图1所示就是当前的典型架构. 图1 这个

Sql server2005 优化查询速度50个方法小结

Sql server2005 优化查询速度50个方法小结 Sql server2005优化查询速度51法查询速度慢的原因很多,常见如下几种,大家可以参考下. I/O吞吐量小,形成了瓶颈效应.  没有创建计算列导致查询不优化.  内存不足.  网络速度慢.  查询出的数据量过大(可以采用多次查询,其他的方法降低数据量).  锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷).  sp_lock,sp_who,活动的用户查看,原因是读写竞争资源.  返回了不必要的行和列.  查询语句不好,没有

为什么数据库索引查询会快

一.使用索引的好处 创建索引可以大大提高系统的性能.第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因.第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义.第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间.第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能. 二.索引的原理 数据在磁盘上是以块的形式存储的.为确保对磁盘操作的原子性,访问数据的时候

【Similarity Search】多探头LSH——构建高维相似性搜索的高效索引

摘要 针对高维数据的相似性索引非常适于构建内容相关的检索系统,尤其对于音频.图像.视频等内容丰富的数据.近年来,位置敏感哈希及其变种算法以近似相似性搜索的索引技术被提出,这些方法的一个显著缺点是需要很多的哈希表来保证良好的搜索效果.该文章提出了一个新的索引策略来克服上述缺点,称作多探头LSH. 多探头LSH建立在LSH技术基础上,它可以智能地探测哈希表中可能包含查询结果的多个桶(buckets),该方法受基于熵的LSh方法(设计用于降低基本LSH方法对空间的要求)的启发.根据评估显示,多探头LS

详细讲解提高数据库查询效率的实用方法、外键关于性能

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放

MySQL中优化sql语句查询常用的种方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from