私はスフィンクスから始めたばかりです。これまでのところ、正常にインストールさ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) . ')';
私の質問は:
これはそれについて行く正しい方法ですか?または、パフォーマンスに優れたデフォルトの「Sphinxの方法」がありますか。
次に、現時点で返されるのは、一致したテーブル行のIDだけです。また、列のテキストの一致する部分が必要です。たとえば、誰かがキーワードを検索し、テーブル
dog
のユーザーの列に次のテキストが含まれている場合:profiles
about
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つの異なる列の内容と照合する必要がある私の状況を考えると、これよりも良い方法がわかりますか?