【问题标题】:how to get the result of mysql match against in form of percentage?如何以百分比的形式获得mysql匹配的结果?
【发布时间】:2011-03-10 09:52:44
【问题描述】:

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

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

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

【问题讨论】:

  • 据我了解,当您在“funny cat”之类的文本中搜索“cat”时,您希望获得 0.50,因为 %50 匹配。但这在正常情况下是不可能的,因为当您搜索“duran”时,可能会出现“duran duran”的情况。据我所知,当您搜索“杜兰”时;即使你有一个单独的行包含“duran”,“duran duran”也会获得更多匹配点。
  • @frail:我走了另一条路。我在想他在所有行中匹配的行的百分比...如果他只想要全文索引/列的匹配百分比代表 - 那么可以理解 duran duran 会获得更多的比赛点(因为它发生得更多)
  • 感谢 frail 和 CarpeNoctumDC,但是我正在寻找类似 PHP 中的 similar_text 函数。再次感谢

标签: mysql match against


【解决方案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 这样的值 - 你最好将这项工作卸载给客户端......

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

【讨论】:

  • 谢谢,但这会给我与真正相似度无关的百分比。我非常感谢您的帮助,但这不是我想要的。
【解决方案2】:

我想出的一个解决方法是找到最佳匹配,并使用它们来获得相对于这些最大值的百分比值,这在这种情况下可能并不完全有用,但它确实给了你一个想法。 我使用这种方法来查找重复项,首先我插入行然后运行此查询,最佳匹配当然是同一行。

首先我必须选择最佳匹配:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-04-05
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多