Как сгруппировать поле MVA для граненого сфинкса - PullRequest
0 голосов
/ 23 января 2020

У меня есть индекс, где в некоторых данных есть дубликаты, все поля похожи, кроме широты, долготы и идентификатора (идентификатор поля не является идентификатором реальности, только что сгенерирован row_number() OVER () AS id).

это пример:

mysql> select id,vacancy_id,prof_area_ids,latitude,longitude from jobVacancy;
+------+------------+---------------+----------+-----------+
| id   | vacancy_id | prof_area_ids | latitude | longitude |
+------+------------+---------------+----------+-----------+
|    1 |        917 | 11,199,202    | 0.973178 |  0.743566 |
|    2 |        916 | 17,283,288    | 0.973178 |  0.743566 |
|    3 |        915 | 17,288        | 0.973178 |  0.743566 |
|    4 |        914 | 30,482        | 0.973178 |  0.743566 |
|    5 |        919 | 15,243        | 0.825153 |  0.692837 |
|    6 |        919 | 15,243        | 0.825162 |  0.692828 |
|    7 |        918 | 8,154         | 0.825153 |  0.692837 |
|    8 |        918 | 8,154         | 0.825162 |  0.692828 |
|    9 |        920 | 17,283,288    | 0.958914 |  1.282161 |
|   10 |        920 | 17,283,288    | 0.958915 |  1.282215 |
|   11 |        924 | 12,208        |  0.97333 |  0.658246 |
|   12 |        924 | 12,208        | 0.973336 |  0.658237 |
|   13 |        923 | 21,365        |  0.97333 |  0.658246 |
|   14 |        923 | 21,365        | 0.973336 |  0.658237 |
|   15 |        922 | 20,359        |  0.97333 |  0.658246 |
|   16 |        922 | 20,359        | 0.973336 |  0.658237 |
|   17 |        921 | 19,346        |  0.97333 |  0.658246 |
|   18 |        921 | 19,346        | 0.973336 |  0.658237 |
|   19 |        926 | 12,17,208,292 |  0.88396 |  2.389868 |
|   20 |        925 | 12,208        |  0.88396 |  2.389868 |
+------+------------+---------------+----------+-----------+
20 rows in set (0.00 sec)

Теперь я хочу сгруппировать данные по vacancy_id

mysql> select id,vacancy_id,prof_area_ids,latitude,longitude from jobVacancy group by vacancy_id;
+------+------------+---------------+----------+-----------+
| id   | vacancy_id | prof_area_ids | latitude | longitude |
+------+------------+---------------+----------+-----------+
|    1 |        917 | 11,199,202    | 0.973178 |  0.743566 |
|    2 |        916 | 17,283,288    | 0.973178 |  0.743566 |
|    3 |        915 | 17,288        | 0.973178 |  0.743566 |
|    4 |        914 | 30,482        | 0.973178 |  0.743566 |
|    5 |        919 | 15,243        | 0.825153 |  0.692837 |
|    7 |        918 | 8,154         | 0.825153 |  0.692837 |
|    9 |        920 | 17,283,288    | 0.958914 |  1.282161 |
|   11 |        924 | 12,208        |  0.97333 |  0.658246 |
|   13 |        923 | 21,365        |  0.97333 |  0.658246 |
|   15 |        922 | 20,359        |  0.97333 |  0.658246 |
|   17 |        921 | 19,346        |  0.97333 |  0.658246 |
|   19 |        926 | 12,17,208,292 |  0.88396 |  2.389868 |
|   20 |        925 | 12,208        |  0.88396 |  2.389868 |
|   21 |        961 | 4,105         | 0.959217 |  1.280721 |
|   23 |        960 | 8,155         | 0.959217 |  1.280721 |
|   25 |        959 | 12,208        | 0.959217 |  1.280721 |
|   27 |        928 | 1,60          | 0.963734 |  1.070297 |
|   29 |        927 | 32,513        | 0.963734 |  1.070297 |
|   31 |        929 | 6,140         | 0.786553 |  0.678649 |
|   33 |        932 | 1,40,46       | 0.824627 |  0.694182 |
+------+------------+---------------+----------+-----------+
20 rows in set (0.00 sec)

Результат потрясающий! Но проблема начинается, когда я хочу получить все сгруппированные данные с граненым

mysql> select id,vacancy_id,prof_area_ids,latitude,longitude from jobVacancy where prof_area_ids=199 group by vacancy_id facet prof_area_ids;
+------+------------+-----------------+----------+-----------+
| id   | vacancy_id | prof_area_ids   | latitude | longitude |
+------+------------+-----------------+----------+-----------+
|    1 |        917 | 11,199,202      | 0.973178 |  0.743566 |
|  191 |       1004 | 11,196,199      | 0.925335 |  2.768874 |
|  313 |       1072 | 1,11,60,197,199 | 0.963968 |  1.070624 |
|  318 |       1136 | 11,196,199      |  0.96071 |  1.448998 |
|  374 |       1097 | 11,199          | 0.785255 |  0.678504 |
+------+------------+-----------------+----------+-----------+
5 rows in set (0.00 sec)

+---------------+----------+
| prof_area_ids | count(*) |
+---------------+----------+
|           202 |        1 |
|           199 |       12 |
|            11 |       12 |
|           196 |        5 |
|           197 |        3 |
|            60 |        3 |
|             1 |        3 |
+---------------+----------+
7 rows in set (0.02 sec)

Фасетный результат неверен. Потому что на самом деле количество данных, где prof_area_ids = 199 должно быть 5, а не 12. Итак, как я могу сгруппировать поля для граненых?

Дополнительно

Я нашел здесь http://sphinxsearch.com/blog/2013/06/21/faceted-search-with-sphinx/ но только что написано: «Если у вас есть фасет MVA, вам нужно использовать функцию GROUPBY (), которая возвращает фактическое значение, по которому была сделана группировка». и без экзамена.

mysql> select id,vacancy_id,prof_area_ids,latitude,longitude,GROUPBY() as selected,COUNT(*) from jobVacancy where prof_area_ids=199 group by vacancy_id facet prof_area_ids;
+------+------------+-----------------+----------+-----------+----------+----------+
| id   | vacancy_id | prof_area_ids   | latitude | longitude | selected | count(*) |
+------+------------+-----------------+----------+-----------+----------+----------+
|    1 |        917 | 11,199,202      | 0.973178 |  0.743566 |      917 |        1 |
|  191 |       1004 | 11,196,199      | 0.925335 |  2.768874 |     1004 |        2 |
|  313 |       1072 | 1,11,60,197,199 | 0.963968 |  1.070624 |     1072 |        3 |
|  318 |       1136 | 11,196,199      |  0.96071 |  1.448998 |     1136 |        3 |
|  374 |       1097 | 11,199          | 0.785255 |  0.678504 |     1097 |        3 |
+------+------------+-----------------+----------+-----------+----------+----------+
5 rows in set (0.00 sec)

+---------------+----------+
| prof_area_ids | count(*) |
+---------------+----------+
|           202 |        1 |
|           199 |       12 |
|            11 |       12 |
|           196 |        5 |
|           197 |        3 |
|            60 |        3 |
|             1 |        3 |
+---------------+----------+
7 rows in set (0.02 sec)

Также граненый результат неверен.

Ответы [ 2 ]

1 голос
/ 24 января 2020

Кажется, что эффективное значение COUNT(DISTINCT vacancy_id) на FACET вместо значения по умолчанию COUNT(*), но, увы, получается,

... FACET prof_area_ids,COUNT(DISTINCT vacancy_id) AS vacancies BY prof_area_ids

не работает. Бит перед BY поддерживает только атрибуты, а не пользовательские функции.

... просто придется написать длинный путь с полными запросами ...

select id,vacancy_id,prof_area_ids,latitude,longitude from jobVacancy
    where prof_area_ids=199 group by vacancy_id;

SELECT GROUPBY() AS prof_area_id, COUNT(DISTINCT vacancy_id) FROM jobVacancy
    WHERE prof_area_ids=199 GROUP BY prof_area_id;

Те же результаты, только чуть более многословные. ie Вместо того, чтобы использовать сокращение FACET, запишите его полностью, как несколько отдельных запросов.

1 голос
/ 23 января 2020

Неверный граненый результат. Потому что на самом деле количество данных, где prof_area_ids = 199 должно быть 5, а не 12. Итак, как я могу сгруппировать поля для граненых?

Похоже, вы неправильно понимаете, как работает FACET. Мне кажется, что вы думаете, что за основу взят основной результат запроса, но на самом деле это просто другая группировка. Например, здесь:

mysql> select g, t from idx_mva where t = 11 group by g facet t;
+------+----------+
| g    | t        |
+------+----------+
|    1 | 11,12    |
|    2 | 11,13,15 |
|    3 | 9,11     |
|    5 | 11,12,15 |
+------+----------+
4 rows in set (0.00 sec)

+------+----------+
| t    | count(*) |
+------+----------+
|   12 |        2 |
|   11 |        6 |
|   15 |        4 |
|   13 |        1 |
|    9 |        1 |
|    3 |        1 |
+------+----------+
6 rows in set (0.00 sec)

для t = 11, вы можете видеть, что, как и в вашем случае, он найден 3 раза в результате 1-го запроса, но счет для этого равен 6 в результате запроса FACET. Это связано с тем, что на самом деле это происходит 6 раз в индексе:

mysql> select * from idx_mva where t = 11;
+------+------+----------+
| id   | g    | t        |
+------+------+----------+
|    2 |    1 | 11,12    |
|    3 |    1 | 11,15    |
|    3 |    2 | 11,13,15 |
|    6 |    3 | 9,11     |
|    8 |    5 | 11,12,15 |
|   11 |    2 | 3,11,15  |
+------+------+----------+
6 rows in set, 1 warning (0.00 sec)

, и это происходит 3 раза в 1-м случае только потому, что значение t возвращается только один раз для каждой из групп. Вы можете использовать group_concat (), чтобы увидеть больше значений из той же группы:

mysql> select g, group_concat(to_string(t)) from idx_mva where t = 11 group by g facet t;
+------+----------------------------+
| g    | group_concat(to_string(t)) |
+------+----------------------------+
|    1 | 11,12,11,15                |
|    2 | 11,13,15,3,11,15           |
|    3 | 9,11                       |
|    5 | 11,12,15                   |
+------+----------------------------+
4 rows in set (0.00 sec)

+------+----------+
| t    | count(*) |
+------+----------+
|   12 |        2 |
|   11 |        6 |
|   15 |        4 |
|   13 |        1 |
|    9 |        1 |
|    3 |        1 |
+------+----------+
6 rows in set (0.00 sec)

Если вы хотите узнать больше о гранении, вот интерактивный курс об этом - https://play.manticoresearch.com/faceting/

...