3

我在 mysql 中 使用Match (Col1) Against (Val) 。

从文章中选择 match(body) against(body_var);

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

4

2 回答 2

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;

正如我所说.. 我对 358 行进行了测试,其中 50 次匹配 50/350 = 0.1396648...(对于第一个结果)0.14 对于四舍五入的结果


如果您希望将相关值转换为单个结果的百分比 - 它实际上不会发生......

MATCH/AGAINST 的相关性值不是百分比匹配的良好指标。这在互联网上有深入介绍。搜索“将相关性值转换为百分比”...

如果您想按相关性匹配百分比对结果进行排序,第一个结果始终具有 100% 相关性,您可以这样做...

至于试图获得像 PHP 的similar_text 这样的值 - 你最好将这项工作卸载给客户端......

全文搜索相关性是用什么来衡量的?

http://forums.mysql.com/read.php?107,125239,146610#msg-146610

http://seminex.blogspot.com/2005/06/mysql-relevance-in-fulltext-search.html

于 2011-03-10T11:06:02.443 回答
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

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

于 2018-03-22T00:47:42.793 回答