全文搜索相关性是以?衡量的?

时间:2008-10-26 12:40:48

标签: mysql performance relevance full-text-search

我正在制作一个测验系统,当测验员向问题库插入问题时,我会检查数据库是否存在重复/非常相似的问题。

测试MySQL的MATCH() ... AGAINST(),当我测试100%相似的字符串时,我获得的最高相关性是30+。

究竟什么是相关性?引用manual

  

相关性值是非负浮点数。零相关意味着没有相似性。根据行中单词的数量,该行中唯一单词的数量,集合中单词的总数以及包含特定单词的文档(行)的数量来计算相关性。

我的问题是如果字符串是重复的,如何测试相关性值。如果它是100%重复,则阻止它插入问题库。但如果它只是如此相似,则提示测验者验证,插入或不插入。那我该怎么做? 30%的100%相同的字符串不是百分比,所以我是残局。

提前致谢。

3 个答案:

答案 0 :(得分:8)

文本检索系统的基本数据结构是Inverted Index。这基本上是在文档集合中找到的单词列表,其中包含它们出现的文档列表。它还可以包含有关每个文档出现次数的元数据,例如单词出现的次数。

可以通过匹配搜索词来查询包含单词的文档。为了确定相关性,在命中计算了一个称为Cosine Ranking的启发式算法。这通过为n个搜索项中的每一个构建具有一个分量的n维向量来工作。如果需要,您还可以对搜索字词进行加权。此向量在n维空间中给出与搜索词对应的点。

可以从反向索引构造基于每个文档中的加权出现的类似向量,其中向量中的每个轴对应于每个搜索项的轴。如果计算这些向量的点积,则得到它们之间角度的余弦值。 1.0等价于cos(0),它假定向量占据了来自原点的公共线。矢量越接近,角度越小,余弦越接近1.0。

如果您按余弦对搜索结果进行排序(或将其按照mg将其按进优先级队列排序),则会获得最相关的搜索结果。更聪明的相关性算法倾向于调整搜索术语的权重,使点积偏向于高相关性的术语。

如果您想稍微挖掘一下,Managing Gigabytes BellMoffet讨论了文本检索系统的内部架构。

答案 1 :(得分:5)

andygeers走在正确的轨道上:这些数字除了彼此之间的关系之外没有任何经验意义,也不能单独使用来确定什么是“完全匹配”或“不完全匹配”。你需要自己确定一下。即使除了全文搜索排名的限制之外,还有一个公开的问题,即你认为什么是“精确匹配”。 (仅限实际文本或soundex匹配计数?同义词(例如,“沙发”与“沙发”)是否匹配或不同?是否应该尝试补偿拼写错误?等等。)

如果我需要执行这样的检查,我只会抓取全文搜索返回的排名最高的条目,删除任何指定的停用词,规范化空格,转换为小写,进行比较,并将其保留在直到我遇到一个要求进一步完善的案例。并不是所有 更多的额外工作 - 如果你指定了你正在使用的语言,你可能会找到一个可以在十几行代码中编写规范化函数的人

答案 2 :(得分:2)

我不知道您正在使用的MySQL函数的细节,但我想可能是这些数字没有绝对意义 - 它们只是被设计为与其生成的其他值进行比较功能。要检查绝对匹配,您可以选择文本本身并手动比较。