3

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."'))スコアは、ワイルドカード*を追加したときではなく、前に完全に計算されます。どちらの場合も、マッチングは正常に機能します。問題は、ワイルドカードがある場合にスコアが計算されないことです。

これに関するどんな助けもいただければ幸いです!(私はこれをほぼ正しく行っていることを願っています)

4

1 に答える 1

0

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";
于 2012-11-08T20:51:51.650 に答える