#php #mysql #count #sphinx
#php #mysql #подсчитывать #sphinx
Вопрос:
Мне приходится иметь дело с запросами, которые имеют много результатов, но я показываю их только в наборах из 20-30 строк.
Затем я использую метод SetLimits() из php API.
Но мне нужно знать, каково общее количество результатов, чтобы вычислить количество страниц (или наборов результатов)
Единственный способ, которым я могу сделать это прямо сейчас, это извлечь все результаты, установив ограничение в 10000000 и посмотреть, что находится в ‘total’ ключе массива, возвращаемого sphinx, но это нехорошо, потому что мне нужно только число count (), я не хочу, чтобы sphinx создавал огромный массив со всеми идентификаторами.
Выполнение запроса select..count() в mysql не сработает, потому что индексированные данные в sphinx всегда разные.
Есть идеи?
Ответ №1:
Разве SphinxClient: query не возвращает данные о том, сколько записей соответствует вашему запросу?
«total» — это количество записей, возвращенных этим запросом (зависит от setLimit), а total_found — это общее количество результатов, соответствующих запросу (не зависит от setLimit), насколько я понимаю.
Ответ №2:
Согласно руководству: SphinxClient::setLimits,
Это должно сработать
$cl->SetLimits(0,0);
Я не разработчик Sphinx, так что это всего лишь слепое предположение… Это должно избегать памяти
переполнение большим количеством результатов.
Дайте мне знать, работает ли это, чтобы я мог удалить answer, если это неверно.
Я также обнаружил, что SELECT..COUNT()
это не работает в запросе Sphinx, так что вы правы в этом.
Также, согласно документации Sphinx, вы можете повторно получить количество результатов, используя SHOW META query .
ПОКАЗАТЬ META
ПОКАЗАТЬ META показывает дополнительную метаинформацию о последнем запросе, такую как время запроса и статистику ключевых слов:
mysql> SELECT * FROM test1 WHERE MATCH('test|one|two');
------ -------- ---------- ------------
| id | weight | group_id | date_added |
------ -------- ---------- ------------
| 1 | 3563 | 456 | 1231721236 |
| 2 | 2563 | 123 | 1231721236 |
| 4 | 1480 | 2 | 1231721236 |
------ -------- ---------- ------------
3 rows in set (0.01 sec)
mysql> SHOW META;
--------------- -------
| Variable_name | Value |
--------------- -------
| total | 3 |
| total_found | 3 |
| time | 0.005 |
| keyword[0] | test |
| docs[0] | 3 |
| hits[0] | 5 |
| keyword[1] | one |
| docs[1] | 1 |
| hits[1] | 2 |
| keyword[2] | two |
| docs[2] | 1 |
| hits[2] | 2 |
--------------- -------
12 rows in set (0.00 sec)
Ссылки:
Ответ №3:
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM information_schema.GLOBAL_STATUS WHERE
VARIABLE_NAME LIKE 'SPHINX_TOTAL_FOUND';
для получения дополнительной информации
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM information_schema.GLOBAL_STATUS WHERE
VARIABLE_NAME LIKE 'SPHINX_%';
Комментарии:
1. ПОКАЗЫВАТЬ СТАТУС ТИПА ‘sphinx_total_found’;