当前位置:  开发笔记 > 后端 > 正文

什么是全文搜索与LIKE

如何解决《什么是全文搜索与LIKE》经验,为你挑选了5个好方法。

我刚看了一篇在SQL中提到"全文搜索"的帖子.

我只是想知道FTS和LIKE之间的区别是什么.我确实阅读了几篇文章,但找不到任何解释得很好的文章.



1> erickson..:

通常,在"精确"和"召回"之间存在权衡.高精度意味着呈现较少的无关结果(无误报),而高召回意味着缺少较少的相关结果(无假阴性).使用LIKE运算符可以提供100%的精度,并且不会让步.全文搜索工具为您提供了很大的灵活性,可以调低精度以便更好地调用.

大多数全文搜索实现使用"反向索引".这是一个索引,其中键是单个术语,关联值是包含术语的记录集.优化全文搜索以计算这些记录集的交集,并集等,并且通常提供排序算法以量化给定记录与搜索关键字匹配的强度.

SQL LIKE运算符效率极低.如果将其应用于未索引的列,则将使用完整扫描来查找匹配项(就像未索引字段上的任何查询一样).如果列已编制索引,则可以对索引键执行匹配,但效率远低于大多数索引查找.在最坏的情况下,LIKE模式将具有需要检查每个索引键的前导通配符.相反,许多信息检索系统可以通过在所选字段中预编译后缀树来支持领先的通配符.

全文搜索的其他典型特征是

词法分析或标记化 - 将非结构化文本块分解为单个单词,短语和特殊标记

形态分析,或将给定单词的词干坍塌变化为一个索引词; 例如,将"老鼠"和"鼠标",或"电气化"和"电子"视为同一个词

排名 - 测量匹配记录与查询字符串的相似性


排名更好地解释在@ VipinJain的[答案](http://stackoverflow.com/a/35765302/212044)

2> Ignacio Vazq..:

FTS涉及索引文本字段中的单个单词,以便快速搜索许多记录.使用LIKE仍然需要您在字段中进行字符串搜索(线性或类似).



3> Vipin Jain..:

MySQL根据启用的全文搜索列的单词创建索引,并对此索引执行搜索.MySQL使用复杂的算法来确定与搜索查询匹配的行.

另外,从这个SO回答:

全文搜索有一些优点.

索引:

就像是:

WHERE Foo LIKE '%Bar';

无法利用索引.它必须查看每一行,看它是否匹配.但是,全文索引可以.实际上,全文索引可以在匹配单词的顺序,这些单词的接近程度等方面提供更多的灵活性.

词干:

全文搜索可以阻止单词.如果搜索运行,则可以获得"运行"或"运行"的结果.大多数全文引擎都有各种语言的词典.

加权结果:

全文索引可以包含多个列.例如,您可以搜索"桃饼",索引可以包含标题,关键字和正文.与标题匹配的结果可以加权更高,更相关,并且可以排序以显示在顶部附近.

缺点:

全文索引可能很大,比标准B-TREE索引大很多倍.出于这个原因,许多提供数据库实例的托管提供商禁用此功能,或至少为此收取额外费用.例如,我上次检查过,Windows Azure不支持全文查询.

更新全文索引的速度也可能较慢.如果数据变化很大,则与标准索引相比可能会有一些滞后更新索引.



4> Mitchel Sell..:

就像只使​​用通配符一样,并不是那么强大.

全文允许更复杂的搜索,包括And,Or,Not,甚至类似的声音结果(SOUNDEX)和更多项目.

我将开始查看SQL CONTAINS()FREETEXT()和相关的全文搜索项,以帮助更好地了解可用的内容.



5> Kingz..:

真正的区别在于扫描方法.对于全文搜索,单词(术语)用作散列键 - 每个键都与键(术语)出现的文档数组相关联.它像这样:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

现在,术语 - 文档矩阵(哪个文档的术语成员)可以表示为:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

当请求询问"获取包含单词/术语t1的所有文档"时,则{d1, d5, d9,.. dn返回文档集}.

您可以破解一个非规范化的表模式来存储文档--MySQL表中的每一行都将被视为"文档",而TEXT列可能包含一个段落等.反向索引将包含作为散列键和行-id的术语作为文件ID.

请记住,此SQL查询将具有或多或少的O(1)性能.查询将独立于

    TEXT列中的单词/术语数

    符合条件的行/文档数

    单词/术语的长度

例如,可以触发此SQL以提取与给定单词XYZ匹配的所有行:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

警告:如果向此查询添加ORDER BY,则运行时将根据几个参数而变化,其中一个参数是匹配的行/文档的数量.所以要小心.

然而,LIKE却一无所获.它被迫线性扫描句子/字符串并找到所有匹配的术语.添加外卡增加了混乱.它可以很好地适用于小长度弦乐,你可以想象,但是对于较长的句子来说,它会失败.当有段落或整页文本等时,绝对无法比较.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有