mysql - 针对查询的通配符匹配导致分数 = 0 (php/sql)

标签 mysql match wildcard

我正在使用 MySql 5.0.45 版的全文查询,并且我正在尝试根据我的需要对其进行优化。评分系统运行良好,但是因为我现在在输入之前添加了一个词干分析器,所以我不得不在搜索词上使用通配符。问题是现在一个词干词将匹配但返回分数为 0。(即:“restriction”被词干化为“restrict”并且仍然会被识别为匹配但分数为 0)

这是查询:

$escaped_string = mysql_real_escape_string($string);
$query = "SELECT DISTINCT A1.item_ID, item, 
              4.0 * (match (`item_1`) against ('". $escaped_string."*'))
              + 3.5 * (match (`item_2`) against ('".$escaped_string."*'))
              + 3.0 * (match (`item_3`) against ('".$escaped_string."*')) 
              + 2.5 * (match (`item_4`) against ('".$escaped_string."*'))
              + 1.5 * (match (`item_5`) against ('".$escaped_string."*'))
            as score
          FROM Items A1 LEFT OUTER JOIN Inventory A2 ON A1.item_ID=A2.item_ID
          WHERE MATCH(`item_1`, `item_2`,`item_3`,`item_4`,`item_5`) AGAINST ('".$escaped_string."*' IN BOOLEAN MODE)
          ORDER BY score DESC
          LIMIT 200";

分数在 ('".$escaped_string."')) 之前计算得很好,但在您添加通配符 * 时则不然。在这两种情况下匹配都很好,问题是如果有通配符则不会计算分数。

如有任何帮助,我们将不胜感激! (我希望我做的大部分是对的)

最佳答案

在我看来,您似乎忘记了将 IN BOOLEAN MODE 添加到分数计算中,因为搜索运算符是该模式独有的;如果我明白http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html正确。

我认为以下应该有效:

$escaped_string = mysql_real_escape_string($string);
$query = "SELECT DISTINCT A1.item_ID, item, 
          4.0 * (match (`item_1`) against ('". $escaped_string."*' IN BOOLEAN MODE))
          + 3.5 * (match (`item_2`) against ('".$escaped_string."*' IN BOOLEAN MODE))
          + 3.0 * (match (`item_3`) against ('".$escaped_string."*' IN BOOLEAN MODE)) 
          + 2.5 * (match (`item_4`) against ('".$escaped_string."*' IN BOOLEAN MODE))
          + 1.5 * (match (`item_5`) against ('".$escaped_string."*' IN BOOLEAN MODE))
        as score
      FROM Items A1 LEFT OUTER JOIN Inventory A2 ON A1.item_ID=A2.item_ID
      WHERE MATCH(`item_1`, `item_2`,`item_3`,`item_4`,`item_5`) AGAINST ('".$escaped_string."*' IN BOOLEAN MODE)
      ORDER BY score DESC
      LIMIT 200";

关于mysql - 针对查询的通配符匹配导致分数 = 0 (php/sql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165181/

相关文章:

Javascript 匹配带有模式的行和后面的行

Java:如何实现通配符匹配?

php - UTF-8贯穿始终

java正则表达式匹配重复数字而不是0,1

javascript - 无法调用ajax函数

full-text-search - Solr:如何在文本字段上搜索完整匹配项?是否有隐藏的 equal() 运算符?

string - 批量 * 通配符替换

asp.net - 如何告诉 ASP.NET Forms 身份验证不对某些文件扩展名进行身份验证?

mysql - Coldfusion 查询无法正常工作

php - 如何在php mysql中显示依赖于下拉子类别的父类别