Каков наилучший способ получения информации из Sphinx (в PHP)?

StackOverflow https://stackoverflow.com/questions/614761

Вопрос

Я новичок в сфинксе и настраиваю его на новом сайте. Он работает нормально, и когда я ищу с помощью 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top