10

私はスフィンクスから始めたばかりです。これまでのところ、正常にインストールさprofilesれ、MySQLデータベースで呼び出されたテーブルにインデックスが付けられ、PHPAPIを使用して正しい結果を取り戻すことができます。私はCodeIgniterを使用しているので、デフォルトのPHPAPIをCodeIgniterライブラリとしてラップしました。

とにかく、これは私のコードがどのように見えるかです:

$query = $_GET['q'];
$this->load->library('sphinxclient');
$this->sphinxclient->setMatchMode(SPH_MATCH_ANY);
$result = $this->sphinxclient->query($query);

$to_fetch = array();
foreach($result['matches'] as $key => $match) {
  array_push($to_fetch, $key);
}

配列$to_fetchには、一致したテーブル行のIDが含まれています。これで、一般的なMySQLクエリを使用して、関連するすべてのユーザーを次のように検索ページに表示できます。

$query = 'SELECT * FROM profiles WHERE id IN('. join(',', $to_fetch) . ')';

私の質問は:

  1. これはそれについて行く正しい方法ですか?または、パフォーマンスに優れたデフォルトの「Sphinxの方法」がありますか。

  2. 次に、現時点で返されるのは、一致したテーブル行のIDだけです。また、列のテキストの一致する部分が必要です。たとえば、誰かがキーワードを検索し、テーブルdogのユーザーの列に次のテキストが含まれている場合:profilesabout

    I like dogs. I also like ice cream.

Sphinxに返してもらいたい:

I like <strong>dogs</strong>. I also like ice cream.

どうやってやるの?関数を試してみましたが、buildExcerpts()機能しません。

編集

これが私が今抜粋を取得している方法です:

// get matched user ids
$to_fetch = array();
foreach($result['matches'] as $key => $match) {
  array_push($to_fetch, $key);
}

// get user details of matched ids
$members = $this->search_m->get_users_by_id($to_fetch);

// build excerpts
$excerpts = array();
foreach($members as $member) {

    $fields = array(
        $member['about'],
        $member['likes'],
        $member['dislikes'],
        $member['occupation']
    );

    $options = array(
        'before_match'      => '<strong class="match">',
        'after_match'       => '</strong>',
        'chunk_separator'   => ' ... ',
        'limit'             => 60,
        'around'            => 3,
    );

    $excerpt_result = $this->sphinxclient->BuildExcerpts($fields, 'profiles', $query, $options);
    $excerpts[$member['user_id']] = $excerpt_result;
}

$excerpts_to_return = array();
foreach($excerpts as $key => $excerpt) {
    foreach($excerpt as $v) {
        if(strpos($v, '<strong class="match">') !== false) {
            $excerpts_to_return[$key] = $v;
        }
    }
}

ご覧のとおり、4つの異なるmysql列で各クエリを検索しています。

about
likes
dislikes
occupation

このため、4つの列のどれに一致したキーワードが含まれているかわかりません。それらのいずれか、または複数の場合もあります。したがって、4つの列すべての内容を関数で実行する以外に選択肢はありませんBuildExcerpts()

それでも、タグBuildExcerpts()付きでどちらが返されたかはわかりません。<strong class="match">そこで、stposによって返されたすべての値に対してチェックを実行しBuildExcerpts()て、最終的に適切な抜粋を取得し、それが属するプロファイルを持つユーザーにマップします。

4つの異なる列の内容と照合する必要がある私の状況を考えると、これよりも良い方法がわかりますか?

4

1 に答える 1

6

はい、それは良い方法に見えます。Mysqlから戻ってくる行は、おそらくsphinxからの順序ではないことを覚えておいてください。

FIELD()の使用方法については、sphinxサイトのFAQを参照してください。ただし、個人的には、sphinxの行を連想配列に入れてから、リストしたsphinxをループして、配列から行を取得するのが好きです。メモリを犠牲にしてソートフェーズを完全に回避します!

ハイライトに関しては、はい、buildExcerptsで頑張ってください-それがそれを行う方法です。


編集して追加します。このデモ http://nearby.org.uk/sphinx/search-example5-withcomments.phps は、mysqlからの行の取得とアプリでの「並べ替え」の両方を示しています。そしてbuildExcerpts。

于 2012-06-18T14:13:49.747 に答える