ФорумПрограммированиеPHP для идиотов → Sphinx, поиск и фильтры

Sphinx, поиск и фильтры

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 7:30

    Есть, типа, доска объявлений. Техника в аренду сдаётся. Разбита по категориям "тракторы, хуякторы ..."

    Есть поиск, по всему этому. Полнотекстовый + плюс фильтр (в конкретной категории, в диапазоне цен) + упорядочивание по цене или по рейтингу.
    В общем, Sphinx тут без проблем справляется.

    Теперь для каждой категории ещё вводится набор характеристик, длина чего-нибудь, грузоподъёмность и т.п. У каждой категории свои характеристики.

    Нужно к поиску добавить ещё фильтр по характеристикам.

    Собсно, как лучше?

    1. Нафигачить для каждой категории свой индекс в сфинксе со своей структурой?

    2. Фильтровать отдельно в базе, искать отдельно в сфинксе, потом искать пересечение?

    3. Или какой-нибудь нормальный вариант?

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 7:43, спустя 13 минут 8 секунд

    поступил бы по пути №2. Это более гибко(вдруг еще захочется добавить логики аля "надо те которые были опубликованы во вторник когда шел дождь") и требует меньше затрат на реализацию.

    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 8:29, спустя 45 минут 49 секунд

    @vasa_c, тоже за второй вариант, так будет проще и гибче

    adw/0
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 9:32, спустя 1 час 3 минуты 6 секунд

    @phpdude, @adw0rd, но там объявлений двести тысоч :'(

    Может у сфинкса какие фичи есть специально под такое?

  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 18 июля 2015 г. 10:43, спустя 1 час 10 минут 12 секунд

    характеристику указываешь в запросе индекса, например duration

    SELECT movie_id,title,duration FROM movies WHERE movie_status='active'
    указываешь duration

    sql_attr_uint = duration

    потом используешь в выборке сфинкс запроса (не знаю какое у тебя АПИ, на примере php):

    $search->setFilterRange('duration',($_GET['duration_from']*60) , $duration_to);

    не забываем про пересоздание индексов, после правки конфига

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 12:35, спустя 1 час 52 минуты 53 секунды

    @Faster, у каждой категории свои характеристики. То есть для каждой категории придётся свой отдельный индекс создавать.

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 13:27, спустя 51 минуту 6 секунд

    @vasa_c, сделай билдер конфига индекса на основе данных по категориям, будет твой вариант №1, но гемороя меньше с поддержкой

    adw/0
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 18 июля 2015 г. 13:33, спустя 6 минут 31 секунду

    У меня когда-то что-то похожее было. И я не искал отдельно в базе, сфинксе, а потом пересечение. А выбирал СНАЧАЛА в сфинксе, он возвращал сотню-две идентификаторов, а потом сёрчил в базе с id IN (...). Так должно получаться быстрее, чем искать пересечение своими силами.

    И рекомендую под разные категории разные индексы, если не будет задачи устраивать сложные выборки по нескольким категориям.

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 15:04, спустя 1 час 30 минут 27 секунд

    @adw0rd, ну, ясное дело, я хоть и не на эрланге, но всё-таки программист какой-никакой, чтобы конфиги на сорок категорий руками писать.

    @mathete, ну я так и хотел, только у меня сфинкс может и десять тысяч вернуть.

    А для поиска по всему сайту, как лучше отдельный полный индекс сделать. Сразу по сорока индексам искать не комильфо?

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 15:10, спустя 6 минут 24 секунды

    @vasa_c, не комильфо

    adw/0
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 16:23, спустя 1 час 13 минут 6 секунд

    окай. всем спасибо, все свободны

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 18 июля 2015 г. 17:33, спустя 1 час 10 минут 9 секунд

    У меня когда-то что-то похожее было. И я не искал отдельно в базе, сфинксе, а потом пересечение. А выбирал СНАЧАЛА в сфинксе, он возвращал сотню-две идентификаторов, а потом сёрчил в базе с id IN (...). Так должно получаться быстрее, чем искать пересечение своими силами.

    И рекомендую под разные категории разные индексы, если не будет задачи устраивать сложные выборки по нескольким категориям.

    @mathete, ну понятно что так более правильный метод, мы уж очевидности озвучивать не стали )) тупо искать в обоих местах а потом пересекать. С помощью сфинкса сужаешь множество, а потом его фильтруешь по категориям и все.

    Сапожник без сапог
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 30 июля 2015 г. 10:19, спустя 11 дней 16 часов 45 минут

    Ебать вы профи все обосрались. В сфинксе есть с версии 2.1 поддержка json, вот и добавьте поле attributes, где ключем будет айди характеристики а значением - значение - инт или список интов

    Спустя 133 сек.

    JSON attributes for optionally schemaless Sphinx indexes [sphinxsearch.com]
    How to filter by Sphinx JSON attributes [sphinxsearch.com]

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 30 июля 2015 г. 11:58, спустя 1 час 38 минут 22 секунды

    @Абырвалг, туда можно любое говно пихать? для каждого документа своя структура?

  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 30 июля 2015 г. 12:08, спустя 10 минут 14 секунд

    конечно

Пожалуйста, авторизуйтесь, чтобы написать комментарий!