1

エラーが発生し続ける次の SQL クエリがあります。

SQL 構文にエラーがあります。description4 行目の 'OR IN BOOLEAN MODE) ORDER BY datetimeASC LIMIT 0,20'付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

これは私が実行しようとしているクエリです:

$items = $itemsClass->getAll($start , $limit, " `status` = 'active' AND MATCH (".sql_quote($s).") AGAINST (`name` OR `description` IN BOOLEAN MODE) ".$whereQuery, "$order");

理由: Web サイトの検索機能に取り組んでいます。特定のキーワード (例: ケーキ) を検索すると、関連するアイテムが表示されます。しかし、ケーキ アイテムと同じタイトル/説明にもある「cook」を検索すると、何も結果が得られず、空であると表示されます。

クエリでこのエラーが発生する理由がわかりません。私は自分の問題の解決策を見つけようとしています。MySQL 5.1.66 を使用しています。

4

2 に答える 2

1

まず、関数に列名を入れ、MATCH()関数にパターンを入れますAGAINST()。あなたはそれを間違った方法でやっています。

第2に、複数の列にわたる検索は暗黙的に「OR」比較であり、インデックス付けされた列のいずれかでのキーワードの一致は一致としてカウントされます。

したがって、次を使用する必要があります。

... MATCH (`name`, `description`) AGAINST (".sql_quote($s).") IN BOOLEAN MODE)"

関数で名前を付ける列MATCH()は、フルテキストインデックスで定義したすべての列であり、インデックスに表示されるのと同じ順序である必要があります。

列ごとに1つずつ、 2つの個別のフルテキストインデックスを定義した場合にのみ、 2つの個別の述語を使用する必要があります。

... MATCH (`name`) AGAINST (".sql_quote($s).") IN BOOLEAN MODE)
    OR 
    MATCH (`description`) AGAINST (".sql_quote($s).") IN BOOLEAN MODE)"
于 2013-01-23T20:39:52.910 に答える
0

あなたが書いた:

MATCH ("your string") AGAINST (`name` OR `description` IN BOOLEAN MODE)

ただし、AGAINST(他の演算子と同様に)この方法では結合できません。それがとる表現はまさにそれです—表現です。などの接続詞の使用はOR、より広い操作に適用するためにアンラップされるのではなく、単に最終的な式を評価するために使用されます。

したがって、通常、接続詞は演算子呼び出しのOR に配置する必要があります。

MATCH ("your string") AGAINST `name` IN BOOLEAN MODE
 OR
MATCH ("your string") AGAINST `description` IN BOOLEAN MODE

ただし、この例では、オペランドMATCHも に切り替えました。

書く:

MATCH (`name`) AGAINST "your string" IN BOOLEAN MODE
 OR
MATCH (`description`) AGAINST "your string" IN BOOLEAN MODE

MATCHそして、本質的に複数の列の検索をサポートすることが起こります。


だから、最後に:

MATCH (`name`, `description`) AGAINST "your string" IN BOOLEAN MODE

この話の教訓は、ドキュメンテーションはあなたの友達だということです。

于 2013-01-23T20:34:04.860 に答える