全文检索什么情况下会慢?为什么慢?全文检索的正确使用方式。

全文 检索 关键字 索引 数据 倒序 情况 条件 搜索 文档 编程技术
发布日期 2022-11-19 更新日期 2022-11-19 阅读次数 104 文章字数 896

全文检索的原理

普通搜索,是遍历文档,从文档里匹配关键字。

而全文检索,是从关键字匹配文档【给每个关键字建立一个索引,一个关键字指向了多个文档,称为倒序索引】

也就意味着,搜索关键字时并不需要遍历文档,而是直接从倒序索引中取数据即可。

数据量的大小,决定了倒序索引的大小。

总体数据量很小的情况,则肯定是很快的,因为就那么一丁点数据,全部遍历就是了。

如果总体数据量很大,则倒序索引就很大,这时候分两种情况:

  1. 仅关键字匹配。此时命中率100%,最快。
  2. 关键字和其他条件。此时一定会100%遍历倒序索引,而刚好倒序索引很大,可想而知最坏的情况下会非常非常慢。

全文检索的错误使用

举个生动的例子:

网盘一千万数据,仅搜索指定目录下、符合条件的数据。则一定会100%遍历输入关键字的倒序索引,如果该倒序索引数据量很大,从中筛选出刚好在该目录下的数据,无疑是大海捞针,慢。

同样网盘一千万数据,如果是普通的 like 匹配,则先通过该目录进行筛选,数据量极小【比倒序索引要小得多】,此时再 like 匹配,速度极快。

对比全文检索 和 like,我们可以发现,针对上面的例子,全文检索的速度比 like 性能更差。

全文检索最佳实践

全文检索性能最佳的情况:

根据前面的分析,仅关键字搜索,此时性能最佳。因为它并不需要遍历文档去匹配是否含有该关键字,而是直接从关键字索引取文档就可以了。

那么,依然是网盘数据搜索,当全盘搜索关键字时,不再有其他条件,此时全文检索速度极快,达到100%命中率。

全文检索的优化

针对全文检索的搜索引擎本身的实现来说,就是要努力克服非关键字条件带来的低效影响。

在实现时,就不能是简单的倒序索引结构。倒序索引结构虽然经典,但也仅仅是关键字匹配,其他条件无能为力,其他条件越多性能越差,从这点上看,全文检索搜索引擎也是分层次的,越专业的全文检索,在面对其他条件时也能有很好的优化,【要考虑全文检索索引,与其他索引的兼容性,顺序性,例如例如上面的例子,如果它能够先筛选目录从而把倒序索引缩小,那么很明显性能提高很多】经过测试,ES对非关键字条件的搜索还是挺快的【毕竟是专业是的】,而MySQL之类的存储数据库虽然也有全文检索,但只要有其他条件性能就会急剧下跌。

对于用户来说,工具已经是那么回事了。在一定情况下,我们可以自己做优化,多份冗余存储,搜索时让其仅针对关键字这一个条件,那么速度就会飞快。


文章作者: 朱丰华

文章链接: https://smart.52dixiaowo.com/blog/post-204.html

版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。

全文 检索 关键字 索引 数据 倒序 情况 条件 搜索 文档

发表评论

相关推荐
朱丰华   |   1周前   |   sql · mysql · 字节 · 字符

mysql常用字段类型详解

45    评论    点赞
朱丰华   |   8个月前   |   git

git从缓存中移除数据git rm --cached

436    评论    点赞
朱丰华   |   1年前   |   页面 · 监听

iframe子父页面信息传递与监听

430    评论    点赞
朱丰华   |   1年前   |   git · hub · 仓库

go克隆并引用github仓库

162    评论    点赞
朱丰华   |   1年前   |   请求 · 一个

ab测压命令,apache测压工具

196    评论    点赞
朱丰华   |   1年前   |   正则 · 表达

正则表达式,实现if...then...else

128    评论    点赞
朱丰华   |   1年前   |   变量 · mysql · sql · 用户

MySQL用户自定义变量

111    评论    点赞
朱丰华   |   1年前   |   sed · 文件

Shell 指定行处理head、tail、sed

167    评论    点赞
朱丰华   |   1年前   |   linux · 内容

linux环境下,对于一个大文件,如何查看其中某行的内容

80    评论    点赞
朱丰华   |   1年前   |   linux · 文件

linux递归统计文件夹大小、du命令_Linux du命令:查看文件夹和文件的磁盘占用情况

208    评论    点赞
朱丰华   |   1年前   |   curl

curl命令忽略ssl证书进行https请求

261    评论    点赞
朱丰华   |   1年前   |   js · vue · 监听

js vue监听,深度监听

123    评论    点赞
朱丰华   |   1年前   |   vue · model

vue语法v-model原理与实现

131    评论    点赞
朱丰华   |   1年前   |   php · 引用 · 变量 · c语言

php扩展内存管理与引用计数

139    评论    点赞
朱丰华   |   1年前   |   zend · php · 类型 · zval

php内核zval类型,与基本类型的转换

127    评论    点赞
朱丰华   |   1年前   |   指针 · 地址 · c语言

C语言的&取地址符,指针

166    评论    点赞
朱丰华   |   1年前   |   sizeof · strlen

C语言里的sizeof()和strlen()关联和区别

125    评论    点赞
朱丰华   |   1年前   |   php · 全局 · 变量

php内核HashTable全局变量数据宏定义,EG,CG,PG,FG

105    评论    点赞
朱丰华   |   1年前   |   php

php执行字符串代码

251    评论    点赞
朱丰华   |   1年前   |   分库 · 分表 · 数据库

数据库,分库和分表的目的有什么不同?

141    评论    点赞
{{item.author_name}}   |   {{new Date(item.date*1000).log()}}   |   {{it}} ·

{{item.title}}

{{item.uv}}    评论    点赞