我在mysql中使用匹配(Col1)反对(Val)。
select match(body) against(body_var) from articles;
现在在完全匹配的情况下,我将结果作为数字(例如14.43)。
这个数字是什么意思?并且主要问题是我能否以百分比形式得到结果(例如0.94)
谢谢你的帮助
答案 0 :(得分:1)
可能有更简单的方法来做到这一点。不知怎的,我在这个兔子洞里摔了下来..但它的测试和工作(返回结果的百分比)
SELECT (mthCount / ttlCount) AS mPercent
FROM (
SELECT COUNT( * ) AS mthCount
FROM articles WHERE (
MATCH(body) AGAINST(body_var)
)
) AS MCount JOIN (
SELECT COUNT( * ) AS ttlCount
FROM articles
) AS TCount;
它返回一个记录/结果,列为mPercent
您也可以将它舍入到小数点后两位......
SELECT FORMAT((mthCount / ttlCount),2) AS mPercent
FROM (
SELECT COUNT( * ) AS mthCount
FROM articles WHERE (
MATCH(body) AGAINST(body_var)
)
) AS MCount JOIN (
SELECT COUNT( * ) AS ttlCount
FROM articles
) AS TCount;
正如我所说..我用50场比赛对358行进行了测试 50/350 = 0.1396648 ...(第一个结果) 舍入结果为0.14
如果您希望将相关性值转换为单个结果的百分比 - 它真的不会发生......
来自MATCH / AGAINST的相关性值并不是匹配百分比的良好指标。这在互联网上有详细介绍。搜索“将相关性值转换为百分比”...
如果你想通过相应的百分比来订购你的结果,第一个结果总是100%相关,你可以这样做......
至于尝试获取类似PHP的similar_text的值 - 您最好将该工作卸载到客户端...
Full-text search relevance is measured in?
http://forums.mysql.com/read.php?107,125239,146610#msg-146610
http://seminex.blogspot.com/2005/06/mysql-relevance-in-fulltext-search.html
答案 1 :(得分:0)
我想出的解决方法是找到最佳匹配,并使用它们来获得相对于这些最大值的百分比值,这在这种情况下可能不完全有用,但它肯定会给你一个想法。 我使用此方法查找重复项,首先我插入行然后运行此查询,最佳匹配当然是同一行。
首先我必须选择最佳匹配:
SELECT
MAX(MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)) AS bscore_col1 ,
MAX(MATCH (table.col2) AGAINST ('text 2'
IN NATURAL LANGUAGE MODE)) AS bscore_col2
FROM table
ORDER BY bscore_name col1 DESC, bscore_col2 DESC) AS bests
您当然可以添加多个列,但必须先创建相应的全文搜索索引。
完整查询从第一个查询中获取结果并将其用作参考,您可以更改0.5的比率,0.5表示获得的分数必须>最佳分数的50%,如果您想获得所有分数结果,删除比较表达式。
SELECT *,
MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)/bests.bscore_col1 AS score_col1 ,
MATCH (table.col2) AGAINST ('text 2' IN NATURAL LANGUAGE MODE)/bests.bscore_col2 AS score_col2
FROM (table,
(SELECT
MAX(MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)) AS bscore_col1 ,
MAX(MATCH (table.col2) AGAINST ('text 2' IN NATURAL LANGUAGE MODE)) AS bscore_col2
FROM table
ORDER BY bscore_col2 DESC, bscore_col1 DESC) AS bests)
WHERE
MATCH (table.col1) AGAINST ('text 1' IN NATURAL LANGUAGE MODE)/bests.bscore_col1 > 0.5 AND
MATCH (table.col2) AGAINST ('text 2'IN NATURAL LANGUAGE MODE)/bests.bscore_col2 > 0.5
ORDER BY score_col2 DESC, score_col1 DESC
我不相信这是最好的解决方案,但在我的情况下它做得很好。