如何以百分比的形式获得mysql匹配的结果?

时间:2011-03-10 09:52:44

标签: mysql match against

我在mysql中使用匹配(Col1)反对(Val)

select match(body) against(body_var) from articles;

现在在完全匹配的情况下,我将结果作为数字(例如14.43)。 这个数字是什么意思?并且主要问题是我能否以百分比形式得到结果(例如0.94)
谢谢你的帮助

2 个答案:

答案 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

我不相信这是最好的解决方案,但在我的情况下它做得很好。