Каков наилучший способ получения информации из Sphinx (в PHP)?
-
03-07-2019 - |
Вопрос
Я новичок в сфинксе и настраиваю его на новом сайте. Он работает нормально, и когда я ищу с помощью search в консоли, все работает.
Использование PHP API и поиска, дает мне те же результаты. Но это дает мне только идентификаторы и веса для найденных строк. Есть ли способ, например, объединить некоторые текстовые поля с хешем «совпадения»?
Если нет способа сделать это, есть ли у кого-нибудь хорошая идея о том, как извлечь записи из базы данных (sql) в порядке сортировки веса сфинксов (ища все их одновременно)?
Решение
Вы можете использовать функцию mysql FIELD () в вашем ORDER BY, чтобы убедиться, что все в указанном порядке sphinx.
$idlist = array();
foreach ( $sphinx_result["matches"] as $id => $idinfo ) {
$idlist[] = "$id";
}
$ids = implode(", ", $idlist);
SELECT * FROM table WHERE id IN ($ids) ORDER BY FIELD(id, $ids)
Другие советы
Да, сфинкс не приносит результатов. Но я нашел простой способ переупорядочить запрос, используя предложение IN (), чтобы собрать все вместе.
Запрос чего-либо
SELECT * FROM table WHERE id IN(id_list... )
просто индексируем результат с их идентификатором в таблице:
while ($row = mysql_fetch_objects)
$result[$row->id] = $row;
и результаты сопоставления со сфинксом очень легко изменить:
$ordered_result = array();
foreach ($sphinxs_results['matches'] as $id => $content)
$ordered_result[] = $result1[$id];
это сработает, если ваши $ sphinxs_results находятся в правильном порядке.
это почти полный ответ, но с меньшим количеством петель. Я полагаю, что можно добиться больших результатов.
К сожалению, sphinx не возвращает совпадающие поля, только его идентификаторы (индекс sphinx не содержит данных - только хеш из данных). Пост об этой проблеме вы можете найти на форуме sphinxsearch.com.
Как говорит Алекс, Сфинкс не возвращает эту информацию. Вам нужно будет использовать идентификаторы для самостоятельного запроса к базе данных - просто циклически просматривайте каждый идентификатор, выводите соответствующие данные, сохраняя результаты в порядке взвешивания. Чтобы сделать все это в одном запросе, вы можете попробовать что-то вроде следующего (псевдо-код - PHP не мой язык выбора):
results = db.query("SELECT * FROM table WHERE id IN (%s)", matches.join(", "));
ordered_results = [];
for (match in matches) {
for (result in results) {
if (result["id"] == match) {
ordered_results << result;
}
}
}
return ordered_results;