2

私はそれを読みました。検索結果をランク付けできるようにするには、次のように MySQL にクエリを実行できます。

SELECT * , 
MATCH (title, body) AGAINST ('$search') AS rating 
FROM posts 
WHERE MATCH (title, body) AGAINST ('$search') 
ORDER BY rating DESC

CakePHP 2.X でこれを行う方法はありますか? また、ページネーションと同時にこれを行う必要があります。したがって、直接の「クエリ」ではなく、ページネーターの条件を記述する必要があると思います。

ご協力いただきありがとうございます!

4

3 に答える 3

3

このように使用すると、mysql インジェクションも防止されます

array("MATCH(User.current_position) AGAINST(? IN BOOLEAN MODE)" => $srch_arr['text'])
于 2015-03-06T07:56:14.430 に答える
2

わかりました、少し時間がかかりました...重要な問題は結果の一致の評価を得ることだったので、このクエリの複雑な部分は特定のフィールドでした:

MATCH (title, body) AGAINST ('$search') AS rating

ページネーション配列の「フィールド」オプションにそのフィールドを書き込むだけでよいと考えました。結果のコードは次のとおりです。

    $this->paginate = array(
            'limit' => 15,
            'fields' => array('*', "MATCH (data) AGAINST ('$q') AS rating"),
            'conditions' =>  "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)",
            'order' => array(
                'rating' => 'desc',
            ),
    );
    $paginatedResults = $this->paginate('SearchIndex');

そして、それはシームレスに機能しました!

これが、Cake を使用して実際の検索結果を得る最良の方法だと思います。誰かがより良い代替手段を持っていない限り:)

二重引用符で囲まれたフレーズを検索すると、期待どおりの結果が得られます。

于 2012-05-31T08:14:42.777 に答える
2

上記の Thomas によるデータベース呼び出しを使用しました (ありがとうございます)。シームレスに動作します。

ただし、コード:

'conditions' =>  "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)",

データ抽象化レイヤーを削除し、サイトを SQL インジェクションに開放します。

おそらくそれほど良くはありませんが(完全にはテストしていません)、試してください:

'SearchIndex.data LIKE'=>'%'.$search.'%'

これが何らかの形で役立つことを願っています。

于 2013-12-02T10:54:49.917 に答える