我有一个包含80,000行的数据库,当我测试一些全文查询时,我遇到了一个意外的结果。我已经从MYSQL中删除了停用词,并将最小单词长度设置为3。
当我执行此查询时:
SELECT `sentence`, MATCH (`sentence`) AGAINST ('CAN YOU FLY') AS `relevance`
FROM `sentences`
WHERE MATCH (`sentence`) AGAINST ('CAN YOU FLY')
ORDER BY `relevance` DESC
它给出这样的结果:
NO A FLY WITHOUT WINGS WOULD BE CALLED A WINGLESS | 10.623517036438
I CAN FLY | 7.61278629302979
I CAN FLY :) | 7.61278629302979
CAN YOU FLY? | 7.61278629302979
THEY CAN FLY | 7.61278629302979
YOU AM NOT FLY | 7.61278629302979
CAN YOU FLY | 7.61278629302979
HAVE YOU EVER SWALLOWED A FLY? | 7.52720737457275
I JUST WANNA FLY | 7.52720737457275
为什么“没有翅膀的苍蝇会被称为没有翅膀的苍蝇”获得了最高的相关性,它只包含一个单词……还有,为什么"CAN YOU FLY“不在最上面,它是完全匹配的。
我希望它按最匹配的关键字排序,然后按排序最多的关键字排序,然后按最少的单词排序。这将给出逻辑结果:
CAN YOU FLY
CAN YOU FLY?
I CAN FLY
THEY CAN FLY
I CAN FLY :)
YOU AM NOT FLY
HAVE YOU EVER SWALLOWED A FLY?
I JUST WANNA FLY
NO A FLY WITHOUT WINGS WOULD BE CALLED A WINGLESS
发布于 2013-03-21 22:51:25
用于计算的公式在MySQL Internals Manual中提供
log w=(
(Dtf)+1)/sumdtf* U/(1+0.0115*U) * log((N-nf)/nf)
哪里
dtf是术语在文档中出现的次数sumdtf是同一文档中所有术语的(log(Dtf)+1)之和U是文档中唯一术语的数量N是文档总数nf是包含该术语的文档数量
第一个文本显然比其他文本有更多的内容。该公式在很大程度上依赖于U
,即文档中唯一术语的数量。
根据您的评论,我建议使用Boolean Fulltext Search
SELECT `sentence`, MATCH (`sentence`) AGAINST ('CAN YOU FLY' IN BOOLEAN MODE) AS `relevance`
FROM `sentences`
WHERE MATCH (`sentence`) AGAINST ('CAN YOU FLY' IN BOOLEAN MODE)
ORDER BY `relevance` DESC
https://stackoverflow.com/questions/15559568
复制