全文检索什么情况下会慢?为什么慢?全文检索的正确使用方式。
全文检索的原理
普通搜索,是遍历文档,从文档里匹配关键字。
而全文检索,是从关键字匹配文档【给每个关键字建立一个索引,一个关键字指向了多个文档,称为倒序索引】
也就意味着,搜索关键字时并不需要遍历文档,而是直接从倒序索引中取数据即可。
数据量的大小,决定了倒序索引的大小。
总体数据量很小的情况,则肯定是很快的,因为就那么一丁点数据,全部遍历就是了。
如果总体数据量很大,则倒序索引就很大,这时候分两种情况:
- 仅关键字匹配。此时命中率100%,最快。
- 关键字和其他条件。此时一定会100%遍历倒序索引,而刚好倒序索引很大,可想而知最坏的情况下会非常非常慢。
全文检索的错误使用
举个生动的例子:
网盘一千万数据,仅搜索指定目录下、符合条件的数据。则一定会100%遍历输入关键字的倒序索引,如果该倒序索引数据量很大,从中筛选出刚好在该目录下的数据,无疑是大海捞针,慢。
同样网盘一千万数据,如果是普通的 like 匹配,则先通过该目录进行筛选,数据量极小【比倒序索引要小得多】,此时再 like 匹配,速度极快。
对比全文检索 和 like,我们可以发现,针对上面的例子,全文检索的速度比 like 性能更差。
全文检索最佳实践
全文检索性能最佳的情况:
根据前面的分析,仅关键字搜索,此时性能最佳。因为它并不需要遍历文档去匹配是否含有该关键字,而是直接从关键字索引取文档就可以了。
那么,依然是网盘数据搜索,当全盘搜索关键字时,不再有其他条件,此时全文检索速度极快,达到100%命中率。
全文检索的优化
针对全文检索的搜索引擎本身的实现来说,就是要努力克服非关键字条件带来的低效影响。
在实现时,就不能是简单的倒序索引结构。倒序索引结构虽然经典,但也仅仅是关键字匹配,其他条件无能为力,其他条件越多性能越差,从这点上看,全文检索搜索引擎也是分层次的,越专业的全文检索,在面对其他条件时也能有很好的优化,【要考虑全文检索索引,与其他索引的兼容性,顺序性,例如例如上面的例子,如果它能够先筛选目录从而把倒序索引缩小,那么很明显性能提高很多】经过测试,ES对非关键字条件的搜索还是挺快的【毕竟是专业是的】,而MySQL之类的存储数据库虽然也有全文检索,但只要有其他条件性能就会急剧下跌。
对于用户来说,工具已经是那么回事了。在一定情况下,我们可以自己做优化,多份冗余存储,搜索时让其仅针对关键字这一个条件,那么速度就会飞快。
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-204.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。