У меня есть индекс со следующей структурой:
+----+-----------+---------+--------------+
| id | entity_id | content | weight_field |
+----+-----------+---------+--------------+
| 1 | 1 | car | 1.2 |
+----+-----------+---------+--------------+
| 2 | 1 | desert | 1.45 |
+----+-----------+---------+--------------+
| 3 | 1 | water | 1.55 |
+----+-----------+---------+--------------+
| 4 | 2 | water | 1.1 |
+----+-----------+---------+--------------+
| 5 | 2 | desert | 1.9 |
+----+-----------+---------+--------------+
Может ли кто-нибудь сказать мне, если это возможно SUM()
значения полей с группировкой?
Я пробовал это
SELECT SUM(weight_field) AS sort, entity_id FROM test_index WHERE MATCH ('@content car|desert|water') GROUP BY entity_id ORDER BY sort DESC
Но получил ошибку:
syntax error, unexpected '(', expecting $end near '()'
Я ожидал получить следующий результат:
+------+-----------+
| sort | entity_id |
+------+-----------+
| 4.2 | 1 |
+------+-----------+
| 3.0 | 2 |
+------+-----------+
Второй способ хорош для меня:
Использовать пользовательские weight_field
(которые содержат значения с плавающей точкой как 1.563
, 1.02
и т. д.) для ранжирования результатов. Но я не уверен, что это можно сделать с
OPTION ranker=...
Итак, я в конце концов нахожу причину:
В реальном коде, а не в примере, я назвал weight_field
как weight
, Таким образом, сфинкс распознал его как предопределенную функцию WEIGHT()
и выкинуть ошибку которая говорит что хочет увидеть ()
после weight
,
После исправления и повторной индексации все работает.
я верю
SELECT SUM(WEIGHT()) AS sort,...
должно сработать. Где WEIGHT()
это значение, рассчитанное текущим ранкером.