【问题标题】:Wildcard Match Against Query causes score to = 0 ( php / sql )通配符匹配查询导致得分 = 0 ( php / sql )
【发布时间】:2012-04-15 19:15:17
【问题描述】:

我正在使用 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."')) 之前计算得很好,但在添加通配符 * 时则不然。在这两种情况下,匹配都很好,问题是如果有通配符,分数不会计算。

对此的任何帮助将不胜感激! (我希望我这样做大部分是正确的)

【问题讨论】:

  • 你试过%而不是*吗?
  • 咬紧牙关学会使用parameters for inquiries
  • @EugenRieck 我已经尝试过了,并且在与它的比赛中只能使用 * 和作为后缀。
  • @xQbert 这是一种我以前从未见过的有趣的做事方式,但我不知道这将如何解决这个问题。这不是我遇到的注射问题......
  • 是的,但是您必须转义字符串,这可能是个问题,因为我不知道每个 escaped_String 中的值是什么。

标签: mysql match wildcard


【解决方案1】:

在我看来,您似乎忘记将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";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多