k-gram索引的通配符查询处理技术称为k-gram索引。
一个k-gram代表由k个字符组成的序列。对于词项castle来说,casaststl都是3-gram。我们用特殊的字符$来标识词项的开始或者结束,因此对于castle来说,所有的3-gram包括$cacasaststltle及le $ .
在k-gram索引结构中,其词典由词汇表中所有词项的所有k-gram形式构成,而每个倒排记录表则由包含该k-gram的词项组成。
然而使用k-gram索引往往还需要进行一步处理。考虑3-gram索引结构的情况,对于查询red*,按照上面的处理步骤我们就会将原始查询转换为布尔查询$re AND red,这时可能会返回诸如retired的词项,因为他同时包含$rered,但是这个结果显然并不满足原始的查询red,也就是说采用k-gram索引会导致非预期的结果。
为了解决这个问题,我们引入一个称为后过滤(postfiltering)的步骤,即利用原始的查询red
对上述布尔查询产生的结果进行逐一过滤。过滤时只需要做简单的字符串匹配。和前面一样,我们最后在普通倒排索引中查找上述过滤得到的结果词项,从而得到最终的文档集合。
一个通配符查询往往会返回多个词项,而每个词项再根据普通倒排索引返回其所在的文档。索引引擎还可以通过布尔操作符支持多个通配符查询的集合,比如 re*d AND fe*ri。那么该查询的语义是什么?由于每个通配符查询都会变成多个词项的或查询,所以上述查询最后变成多个查询的与,即寻找包含同时匹配上red和feri的词项文档。
即使没有通配符查询的布尔组合,单个通配符查询处理也是非常耗时的,除了最后要在普通倒排索引中查找之外,还要在特定索引(如轮排索引或k-gram索引)中进行查找、在结果中进行过滤等操作。搜索引擎可以支持这些丰富的功能,但是搜索引擎通常将这些功能隐藏在一个大部分用户不访问的界面(如“高级索引”界面)下。如果把这些功能暴露在一般搜索界面上,用户常常会受到鼓励而使用这些功能,即便他们不是特别需要的时候(比如以a*开始的查询的索引),这样就会大大增加搜索引擎的负担。

支持通配符查询的k-gram索引的更多相关文章

  1. mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)

    mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...

  2. mysql sql_safe_updates 不支持子查询的更新。

    考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...

  3. 十四、C# 支持标准查询运算符的集合接口

    支持标准查询运算符的集合接口. System.Linq.Enumeralbe类提供的一些常用的API 来执行集合处理 1.匿名类型 2.隐匿类型的局部变量 3.集合初始化器 4.集合 5.标准查询运算 ...

  4. MySQL中IN子查询会导致无法使用索引

    今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表 ...

  5. 生成线上用https证书,支持通配符和多域名,初学Let’s Encrypt用于IIS,纯本地手动

    自简书发布的上篇<生成本地测试用https证书,支持通配符和多域名,初学OpenSSL>以来,本地测试用https用的妥妥的. 线上一直用的腾讯云的免费证书(每个域名都要一个证书(滑稽), ...

  6. (5)MySQL的查询:模糊查询(通配符查询like)、限制符查询(limit)、排序查询(order by)、分组查询(group by)、(子查询)

    注意事项 指令语法的优先级: where > group by >order by > limit 例:select count(id) as cnt,age from tablen ...

  7. 使用mysql5.7新特性解决前通配符查询性能问题

    众所周知,在mysql里的后通配符可以使用索引查找,前通配查询却无法使用到索引,即使是使用到了索引,也是使用了索引全扫描,效率依然不高,再MySQL5.7之前,一直都没有好的办法解决,但是到了MySQ ...

  8. MySQL中in子查询会导致无法使用索引问题(转)

    MySQL的测试环境 测试表如下 create table test_table2 ( id int auto_increment primary key, pay_id int, pay_time ...

  9. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

随机推荐

  1. PAT 甲级 1128. N Queens Puzzle (20) 【STL】

    题目链接 https://www.patest.cn/contests/pat-a-practise/1128 思路 可以 对每一个皇后 都判断一下 它的 行,列 ,左右对角线上 有没有皇后 深搜解决 ...

  2. hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

    #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...

  3. Warning: Cannot send session cookie – headers already sent…

    相信大多数人在写PHP代码的时候,都遇到过类似 "Warning: Cannot send session cookie – headers already sent…“或者”Cannot ...

  4. Hadoop- 流量汇总程序之如何实现hadoop的序列化接口及代码实现

    流量汇总程序需求 统计每一个用户(手机号)锁耗费的总上行流量.下行流量.总流量. 流程剖析 阶段:map 读取一行数据,切分字段, 抽取手机号,上行流量,下行流量 context.write(手机号, ...

  5. matlab之text()函数

    text()函数用来给图加上说明性文字. 格式:text(x,y,'txt') 或者:text(x,y,'txt','color','k') x,y是位置 txt是说明文字,如果说明性文字是数字,则这 ...

  6. jQuery 获取有多个class名的元素

    HTML内容: <div class="write-upload"> <p class="write-files old-files"> ...

  7. NASNet学习笔记——   核心一:延续NAS论文的核心机制使得能够自动产生网络结构;    核心二:采用resnet和Inception重复使用block结构思想;    核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。

    from:https://blog.csdn.net/xjz18298268521/article/details/79079008 NASNet总结 论文:<Learning Transfer ...

  8. hdu-5816 Hearthstone(状压dp+概率期望)

    题目链接: Hearthstone Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  9. inteliji ---idea 如何创建scala程序配置

    首先创建一个新的工程: #####################################################################################

  10. 乱写的一个SQL框架

    闲来没事,看了mybatis的实现形式,就心血来潮的自己弄了一个仿照mybatis的框架,性能肯定不好,而且有很多问题,但是是一次有益的尝试 1.基本配置文件 <!--加载数据源--> & ...