Это правильный способ использовать Sphinx из PHP?
я только начинаю со Сфинкса. До сих пор я успешно установил его, получил таблицу под названием profiles
на моей базе данных MySQL индексируется и я могу получить правильные результаты с помощью PHP API. Я использую CodeIgniter, поэтому я завернул PHP API по умолчанию в библиотеку 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
содержит идентификаторы сопоставленных строк таблицы. Теперь я могу использовать типичный запрос MySQL, чтобы получить все соответствующие пользователи для отображения на странице поиска так:
$query = 'SELECT * FROM profiles WHERE id IN('. join(',', $to_fetch) . ')';
мой вопрос:
правильно ли это? или есть по умолчанию "способ Сфинкса", который был бы лучше для производительности .
-
во-вторых, все, что я получаю обратно на данный момент, это идентификатор сопоставленных строк таблицы. Я также хочу, чтобы часть текста в столбце, который соответствует. Например, если кто-то ищет ключевое слово
dog
и пользователей наprofiles
таблица была в их следующий текст:I like dogs. I also like ice cream.
я хотел бы, чтобы сфинкс вернулся:
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 колонки через
1 ответов
Да, это выглядит хорошо. Одно дело помнить, что строки, возвращающиеся из Mysql, вероятно, не будут в порядке от sphinx.
см. FAQ на сайте sphinx для того, как использовать FIELD (), но лично мне нравится помещать строки из sphinx в ассоциативный массив, а затем просто цикл, хотя сфинкс я бы список и получить строку из массива. Избегает фазы сортировки вообще за счет памяти!
Что касается подсветки, да, упорствуйте с buildExcerpts - это способ сделать это.
изменить, чтобы добавить эту демонстрацию http://nearby.org.uk/sphinx/search-example5-withcomments.phps демонстрирует как получение строк из mysql, так и" сортировку " в приложении. И buildExcerpts.