За последние 24 часа нас посетили 20143 программиста и 1664 робота. Сейчас ищет 1861 программист ...

Sphinx.как сделать поиск по товару и вывод категорий/брендов

Тема в разделе "Прочее", создана пользователем maxycwebber, 24 апр 2014.

  1. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    Есть кто мог бы помочь?

    Прошу помощи. Нахожусь в самом начале пути знакомства со сфинксом. Прошу поправить мозг в сторону правильной работы со сфинксом.
    Есть магазин. Есть товары.
    Вроде бы научился индексировать таблицу с товарами.

    У каждого товара есть привязка 1 к 1 к брендам и 1 ко многому к категориям.
    1. Как сделать поиск по товару и вывод категорий/брендов в которых доступны найденные товары?
    2. Как сделать поиск по категории?
    3. Как сделать поиск по бренду?

    Прошу не код писать. а разобрать алгоритм работы сего действа.

    п.с. 2-3 вопросы примерно понимаю так:
    В сорсах сфинкса указываю sql_attr_*= и уже из кода через апи фигурирую с этими параметрами.
    Как быть с 1 вопросом?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Sphinx.как сделать поиск по товару и вывод категорий/бре

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

    Запрос делаешь - получаешь те поля. По ним уже делаешь все остальные запросы в БД.
     
  3. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    Re: Sphinx.как сделать поиск по товару и вывод категорий/бре

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

    мог бы ты пример таки показать?
    товары: id(PK INT), name(str), active(Y)
    катгеории id, name
    связь м2м: category_id, good_id
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Sphinx.как сделать поиск по товару и вывод категорий/бре

    сфинксу в конфиг пишешь запрос полей из базы данных. он их запомнит. указываются типы полей.
    соотв ты пишешь для товара простой запрос в конфиг:
    SELECT `id`, `name`, `active`

    запускаешь индексатор. он индексирует.

    потом ты делаешь в сфинкс запрос по какому полю какое слово искать. он вернёт то, что наиндексировал. и ты по айдишнику можешь из бд вытащить все остальные данные.

    вот мой конфиг:
    Код (Text):
    1. #
    2. # Minimal Sphinx configuration sample (clean, simple, functional)
    3. #
    4.  
    5. source src1
    6. {
    7.     type            = mysql
    8.  
    9.     sql_host        = localhost
    10.     sql_user        = bsm
    11.     sql_pass        = bsm
    12.     sql_db          = bsm
    13.     sql_port        = 3306  # optional, default is 3306
    14.  
    15.     sql_query_pre = SET NAMES 'utf8'
    16.  
    17.     sql_query       = \
    18.         SELECT `id`, UNIX_TIMESTAMP(`created`) AS `ucreated`, COALESCE(UNIX_TIMESTAMP(`task_deadline`), 1) AS `utask_deadline`,\
    19.         `state`, `wtlabel`, `discipline`, `theme`, `email`, `name`, `vuz`, `comment`\
    20.         FROM `requests`
    21.  
    22.     sql_attr_timestamp  = ucreated
    23.     sql_attr_timestamp  = utask_deadline
    24.     sql_attr_uint       = state
    25.     sql_field_string    = wtlabel
    26.     sql_field_string    = discipline
    27.     sql_field_string    = theme
    28.     sql_field_string    = email
    29.     sql_field_string    = name
    30.     sql_field_string    = vuz
    31.     sql_field_string    = comment
    32.  
    33.     sql_query_info      = SELECT * FROM `requests` WHERE `id`=$id
    34. }
    35.  
    36.  
    37. index test1
    38. {
    39.     source          = src1
    40.     path            = /var/lib/sphinx/test1
    41.     docinfo         = extern
    42.     charset_type        = utf-8
    43.     morphology = stem_enru, Soundex, Metaphone
    44. }
    45.  
    46.  
    47. index testrt
    48. {
    49.     type            = rt
    50.     rt_mem_limit        = 32M
    51.  
    52.     path            = /var/lib/sphinx/testrt
    53.     charset_type        = utf-8
    54.  
    55.     rt_field        = title
    56.     rt_field        = content
    57.     rt_attr_uint        = gid
    58. }
    59.  
    60.  
    61. indexer
    62. {
    63.     mem_limit       = 32M
    64. }
    65.  
    66.  
    67. searchd
    68. {
    69.         listen                  = 127.0.0.1:9312
    70.     listen          = 9306:mysql41
    71.     log         = /var/log/sphinx/searchd.log
    72.     query_log       = /var/log/sphinx/query.log
    73.     read_timeout        = 5
    74.     max_children        = 1
    75.     pid_file        = /var/run/sphinx/searchd.pid
    76.     max_matches     = 1000
    77.     seamless_rotate     = 1
    78.     preopen_indexes     = 1
    79.     unlink_old      = 1
    80.     workers         = threads # for RT to work
    81.     binlog_path     = /var/lib/sphinx
    82.  
    83.     compat_sphinxql_magics  = 0
    84. }
     
  5. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Re: Sphinx.как сделать поиск по товару и вывод категорий/бре

    maxycwebber, смотри. Я бы в первую очередь выяснил для себя еще пару нюансов.

    Во-первых, сделать индекс, который будет индексироваться в определенные моменты, или же который будет актуален в любое время (он же real time index).
    Во-вторых, как ты будешь его юзать (лично я бы не советовал использовать php api, а предпочел бы скорее sphinxql).

    По поводу первого. Как по мне, с rt таблицами проще работать. Сделал запрос - получил ответ. Ты точно знаешь, что ничего не упустил. Но есть и обратная сторона медали - захочешь что-то изменить в структуре таблицы, то придется старую rt таблицу убивать и заново вставлять все записи в соответствии с новой структурой. В индексах, которые ты индексируешь с помощью утилиты indexer можно легко изменить структуру данных, но эти индексы не дают гарантии, что данные в них актуальны. Также при больших объемах данных (я имею ввиду очень большие объемы), когда indexer очень долго индексирует БД - люди начинают изобретать велосипеды (всякие дельта индексы, которые че-то там индексируют часть БД, потом склеивают с основным индексом... вообщем - жуть). Какой способ хранения выберешь ты - нужно смотреть по ситуации.

    Вот. Это я к тому, чтобы ты не напоролся на те же грабли, что и я. Я сначала у себя сделал такие таблицы, которые кроном каждые десять минут обновляются, повтыкал - не нравится. Пришлось переделывать.

    По поводу php api - оно уже довольно старое, да и sphinxql поудобнее будет.

    Теперь по поводу работы сфинкса. Сфинкс возвращает идентификаторы нужных тебе строк из твоей таблицы - на этом как бы базируется основной подход. Как ты уже будешь выводить данные, имея нужные идентификаторы - это уже твое дело. Это же касается и вывода категорий/брендов.

    Если нужно найти товар, то используешь match
    Код (Text):
    1.  
    2. SELECT * FROM products WHERE MATCH('мелок машенька') ORDER BY @weight DESC;
    Если нужно найти по категории
    Код (Text):
    1.  
    2. SELECT * FROM products WHERE category_id = $category_id;
    Если найти и отфильтровать
    Код (Text):
    1.  
    2. SELECT * FROM products WHERE MATCH('мелок машенька') AND category_id = $category_id AND brand_id = $brand_id ORDER BY @weight DESC;
    Добавлено спустя 2 минуты 41 секунду:
    Re: Sphinx.как сделать поиск по товару и вывод категорий/брендов
    Для этого не обязательно юзать сфинкс, можно sql

    Добавлено спустя 5 минут 34 секунды:
    Re: Sphinx.как сделать поиск по товару и вывод категорий/брендов
    Хотя я гоню...

    Совсем не обязательно в на индекс полностью отображать таблицу.
    Н-р:
    Таблица товаров: id, category_id, brand_id, name...
    Таблица категорий: id, name
    Таблица брендов: id, name

    И делаешь такой индекс: id, category_id, brand_id, name...

    В итоге ты получаешь вместе с найденными товарами и нужные категории и нужные бренды. Потом пыхой все это лейно разбираешь)