1

ユーザーが作成したキーワードに基づいて、データベースからかなり短い文字列を取得するクエリを作成しました (彼の回答はzhikharevの功績によるものです)。

$searchArray = explode(' ', $search);
$searchNumber = count($searchArray);

$query = "SELECT * FROM tags WHERE tags.tag LIKE CONCAT('%',?,'%')" . 
    str_repeat(" OR tags.tag LIKE CONCAT('%',?,'%')", $searchNumber - 1);

$stmt = $mysqli -> prepare($query);
$bind_names[] = str_repeat('s', $searchNumber);

for ($i = 0; $i < count($searchArray); $i++){
    $bind_name = 'bind'.$i; /*generate a name for variable bind1, bind2, bind3...*/
    $$bind_name = $searchArray[$i]; /*create a variable with this name and put value in it*/
    $bind_names[] = & $$bind_name; /*put a link to this variable in array*/
}

call_user_func_array(array($stmt, 'bind_param'), &$bind_names);
$stmt -> execute();

私の問題は、この結果を関連性でソートする方法がわからないことです。データベース内の 1 つのタグに複数の単語を含めることができることに注意してください。

ユーザーが「ニューヨーク市」を検索したとします。次に、データベースに次のものがあります。

    New York
    York
    New York City
    New Zealand
    Kansas City

結果を次のようにしたいと思います。

    New York City
    New York
    New Zealand
    York
    Kansas City

ユーザー入力の単語と最も一致するタグ、および検索の単語の順序とほぼ同じ単語の順序を持​​つタグを探す必要があります。

4

1 に答える 1

0

これは、Sphinx などのスタンドアロンの全文検索エンジンの最適な使用例です。私は最近、あるプロジェクトで Sphinx を使い始めましたが、今のところとても満足しています。インデックスは非常に高速で、MySQL の直接クエリよりも 10 倍の速度向上が見られました。

スター モードを有効にすると、部分一致が許可されます: http://sphinxsearch.com/docs/2.0.6/conf-enable-star.html

また、さまざまな並べ替え方法も使用できます: http://sphinxsearch.com/docs/2.0.6/sorting-modes.html

その他のリンク: http://sphinxsearch.com/docs/2.0.6/ http://php.net/manual/en/sphinx.examples.php

于 2013-01-20T02:23:13.070 に答える