Ответы пользователя по тегу Sphinx
  • Как индексировать одна ко многим таблиц на sphinx?

    @rotarepmipoleved
    Предлагаю посмотреть со стороны корректировки архитектуры для конкретного случая.
    Таблицы parent и child можно объединить в одну - family, получив структуру аналогичную таблице child.
    - id
    - parent_id
    - name
    - age

    Получим что-то вроде:
    --------------------------------
    id | parent_id | name | age
    --------------------------------
    1 | 0 | Отец | 30
    2 | 1 | Дочь | 9
    3 | 1 | Дочь2 | 7
    4 | 0 | Отец2 | 41
    5 | 4 | Дочь3 | 12

    Тогда в самом индексе получим три поля:
    - name
    - age
    - parent_id

    Ищем среди родителей:
    WHERE parent_id = 0 AND MATCH('@name "Отец"')

    Ищем среди детей:
    WHERE parent_id > 0 AND MATCH('@name "Дочь"')

    Есть еще минимум 1 вариант избегания дублей информации - группировать по необходимому признаку и конкетировать поля с помощью MySQL функции GROUP_CONCAT использовав разделитель для дальнейшего обращения в массив.
    Например, при группировке по полю parent_name нужно конкетировать 3 поля - child_id, child_name, child_age:
    SELECT \
            row_number() OVER () AS id, \
            p.id as parent_id, \
            p."name" as parent_name, \
            p.age as parent_age, \
            GROUP_CONCAT(ch.id SEPARATOR '|') as child_id, \
            GROUP_CONCAT(ch.name SEPARATOR '|') as child_name, \
            GROUP_CONCAT(ch.age SEPARATOR '|') as child_age\
    FROM parent p\
    JOIN child ch ON ch.parent_id=p.id\
    GROUP BY parent_id


    При SELECT * FROM index WHERE parent_id = 1 получим что-то подобное:
    ----------------------------------------------------------------------------
    id | parent_id | parent_name | child_id | child_name | child_age
    ----------------------------------------------------------------------------
    1 | 1 | Отец | 1|2|3 | aa|ab|ac | 2|3|4

    После выполнения запроса конкетированые строки нужно обработать для нормальной работы с child_* полями.

    В целом, способ и саму необходимость каких-либо изменений хорошо определять опираясь на конкретные задачи.
    Ответ написан
    Комментировать