Как подсчитать результаты в sphinx?

#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’;