Есть кто мог бы помочь? Прошу помощи. Нахожусь в самом начале пути знакомства со сфинксом. Прошу поправить мозг в сторону правильной работы со сфинксом. Есть магазин. Есть товары. Вроде бы научился индексировать таблицу с товарами. У каждого товара есть привязка 1 к 1 к брендам и 1 ко многому к категориям. 1. Как сделать поиск по товару и вывод категорий/брендов в которых доступны найденные товары? 2. Как сделать поиск по категории? 3. Как сделать поиск по бренду? Прошу не код писать. а разобрать алгоритм работы сего действа. п.с. 2-3 вопросы примерно понимаю так: В сорсах сфинкса указываю sql_attr_*= и уже из кода через апи фигурирую с этими параметрами. Как быть с 1 вопросом?
Re: Sphinx.как сделать поиск по товару и вывод категорий/бре ну указал поля, которые индексировать из нужной таблицы. ну индекснул. Запрос делаешь - получаешь те поля. По ним уже делаешь все остальные запросы в БД.
Re: Sphinx.как сделать поиск по товару и вывод категорий/бре мужик, я прошу прощения за свою тупость, но я нифига не понял. у меня не получается вообще втянуться в идеологию работы сфинкса. мог бы ты пример таки показать? товары: id(PK INT), name(str), active(Y) катгеории id, name связь м2м: category_id, good_id
Re: Sphinx.как сделать поиск по товару и вывод категорий/бре сфинксу в конфиг пишешь запрос полей из базы данных. он их запомнит. указываются типы полей. соотв ты пишешь для товара простой запрос в конфиг: SELECT `id`, `name`, `active` запускаешь индексатор. он индексирует. потом ты делаешь в сфинкс запрос по какому полю какое слово искать. он вернёт то, что наиндексировал. и ты по айдишнику можешь из бд вытащить все остальные данные. вот мой конфиг: Код (Text): # # Minimal Sphinx configuration sample (clean, simple, functional) # source src1 { type = mysql sql_host = localhost sql_user = bsm sql_pass = bsm sql_db = bsm sql_port = 3306 # optional, default is 3306 sql_query_pre = SET NAMES 'utf8' sql_query = \ SELECT `id`, UNIX_TIMESTAMP(`created`) AS `ucreated`, COALESCE(UNIX_TIMESTAMP(`task_deadline`), 1) AS `utask_deadline`,\ `state`, `wtlabel`, `discipline`, `theme`, `email`, `name`, `vuz`, `comment`\ FROM `requests` sql_attr_timestamp = ucreated sql_attr_timestamp = utask_deadline sql_attr_uint = state sql_field_string = wtlabel sql_field_string = discipline sql_field_string = theme sql_field_string = email sql_field_string = name sql_field_string = vuz sql_field_string = comment sql_query_info = SELECT * FROM `requests` WHERE `id`=$id } index test1 { source = src1 path = /var/lib/sphinx/test1 docinfo = extern charset_type = utf-8 morphology = stem_enru, Soundex, Metaphone } index testrt { type = rt rt_mem_limit = 32M path = /var/lib/sphinx/testrt charset_type = utf-8 rt_field = title rt_field = content rt_attr_uint = gid } indexer { mem_limit = 32M } searchd { listen = 127.0.0.1:9312 listen = 9306:mysql41 log = /var/log/sphinx/searchd.log query_log = /var/log/sphinx/query.log read_timeout = 5 max_children = 1 pid_file = /var/run/sphinx/searchd.pid max_matches = 1000 seamless_rotate = 1 preopen_indexes = 1 unlink_old = 1 workers = threads # for RT to work binlog_path = /var/lib/sphinx compat_sphinxql_magics = 0 }
Re: Sphinx.как сделать поиск по товару и вывод категорий/бре maxycwebber, смотри. Я бы в первую очередь выяснил для себя еще пару нюансов. Во-первых, сделать индекс, который будет индексироваться в определенные моменты, или же который будет актуален в любое время (он же real time index). Во-вторых, как ты будешь его юзать (лично я бы не советовал использовать php api, а предпочел бы скорее sphinxql). По поводу первого. Как по мне, с rt таблицами проще работать. Сделал запрос - получил ответ. Ты точно знаешь, что ничего не упустил. Но есть и обратная сторона медали - захочешь что-то изменить в структуре таблицы, то придется старую rt таблицу убивать и заново вставлять все записи в соответствии с новой структурой. В индексах, которые ты индексируешь с помощью утилиты indexer можно легко изменить структуру данных, но эти индексы не дают гарантии, что данные в них актуальны. Также при больших объемах данных (я имею ввиду очень большие объемы), когда indexer очень долго индексирует БД - люди начинают изобретать велосипеды (всякие дельта индексы, которые че-то там индексируют часть БД, потом склеивают с основным индексом... вообщем - жуть). Какой способ хранения выберешь ты - нужно смотреть по ситуации. Вот. Это я к тому, чтобы ты не напоролся на те же грабли, что и я. Я сначала у себя сделал такие таблицы, которые кроном каждые десять минут обновляются, повтыкал - не нравится. Пришлось переделывать. По поводу php api - оно уже довольно старое, да и sphinxql поудобнее будет. Теперь по поводу работы сфинкса. Сфинкс возвращает идентификаторы нужных тебе строк из твоей таблицы - на этом как бы базируется основной подход. Как ты уже будешь выводить данные, имея нужные идентификаторы - это уже твое дело. Это же касается и вывода категорий/брендов. Если нужно найти товар, то используешь match Код (Text): SELECT * FROM products WHERE MATCH('мелок машенька') ORDER BY @weight DESC; Если нужно найти по категории Код (Text): SELECT * FROM products WHERE category_id = $category_id; Если найти и отфильтровать Код (Text): 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... В итоге ты получаешь вместе с найденными товарами и нужные категории и нужные бренды. Потом пыхой все это лейно разбираешь)