Подход (алгоритмы и тд) чтобы сделать поиск по параметрам как на Яндекс-маркете?

Здравствуйте!


Хочу спросить у опытных людей каких образом можно сделать универсальный поиск по базе продуктов как на Яндекс-маркете.


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


Т.е. мы имеем разнотипную продукцию с разными характеристиками — это могут быть:

— числовые характеристики (диапазоны и тд);

— выбор из справочников множественный;

— выбор из справочников одинарный;

— разные единицы измерения;

— другие типы критериев.


Довольно интересный был вводный топик о подходящем использовании для такой задачи MongoDB MongoDB или как разлюбить SQL — там как раз пример Яндекс-Маркета приводился, но тема не была до-конца раскрыта.


Также подскажите — может я замахнулся на слишком сложную идею, которую не под силу реализовать одному человеку за разумное кол-во времени? Тогда придется упростить задачу и не гнаться за универсальным решением?


Наверное я не первый об этом задумался?
  • Вопрос задан
  • 9497 просмотров
Решения вопроса 1
akalend
@akalend
программирую
Также подскажите — может я замахнулся на слишком сложную идею, которую не под силу реализовать одному человеку за разумное кол-во времени?

начни с минимума, потом поймешь чего не хватает!
главное запуститься, доработаешь в процессе. Я тоже упростил поиск до (разумного) минимума.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 7
Вообще ваша задача как я понял это т.н. фасеточный поиск. en.wikipedia.org/wiki/Faceted_search
Когда передо мной стояла такая проблема я решал ее таким образом: есть таблица «товаров», в которой все товары.
Есть справочник «характеристик».
Есть таблица в которой идут тройки id товара — id характеристики из справочника — значение
Вся эта база индексируется сфинском. Далее делается примерно как описано в статье: habrahabr.ru/blogs/sphinx/64318/

Т.е. сначала например пользователь делает поисковый запрос «телефоны samsung». Одним запросом к базе данных мы выводим все телефоны, а используя группировку по id характеристики получаем все характеристики, которые возможны для этих товаров: т.е. например диагональ экрана, операционная система, ну и потом выбираем для каждой характеристики возможные значения, подходящие под запрос. Благодаря мульти-запросам такой поиск работает довольно быстро.

Потом соответственно пользователю предлагается выбрать характеристики из списка возможных. Ну и в общем то весь алгоритм. За разумное время реализуется, работает довольно быстро, с добавлением товаров в таблицу проблем нет.
Ответ написан
Aleksey
@Aleksey
Советую обратить внимание на Apache Solr. Ключевая функциональность требуемая для такого ресурса — фасетная навигация. Apache Solr поддерживает различные фильтры/фасеты по числовым диапазонам (цены), датам, категориям/тэгам (множественные значения) и тд. Все фильтры кэшируются в памяти в ввиде битсетов. В дополнение ко всему отличный полнотекстовый поиск, подсказки правописания, возможность поиска схожих документов-товаров по описанию основанное на tf*idf которое дает высоко релевантные результаты, распределенный поиск, шардирование, репликацию и многое другое. Apache Solr используется весьма известными сайтами поиска товаров типа zappos, cnet и пр.
Ответ написан
Комментировать
conturov
@conturov
Я дела так:
Таблица 1: Товар
Таблица 2: Категории для товара
Таблица 3: Названия параметров
Таблица 4: Связка Параметров к категориям (При выборе у товара категории подгружаю соответствующие параметры)
Таблица 5: Связка — Значение параметра с конкретным товаром (id, id_item, id_param,var_param)
Таким образом мы параметры вешаем на категорию, при добавления товара выбираем категорию и получаем набор параметров для этой категории.

Чем мне это нравится:
1) Любая вложенность категории со своими параметрами.
2) Можно делать динамическую форму поиска в который давать выбирать параметры в зависимости от категории.
3) Легкие небольшие запросы.
Ответ написан
@antonlustin
а чем не устраивает генерация запроса в зависимости от выбранных фильтров?
Ответ написан
bagyr
@bagyr
Задача, вроде, хорошо ложится на реляционные БД, на бенчмарки с диким количеством insert'ов смотреть точно не надо. Какую-нибудь автоматизацию фильтров атрибутов прикрутить тоже можно. Принципиальных сложностей с ходу не видно, вопрос, скорее, в масштабах, но до конца в одиночку реализовать будет очень сложно.
Ответ написан
akalend
@akalend
программирую
я разрабатывал похожую систему, второй похожий проект в разработке.
пока для поиска использую Сфинкс — статья про поиск в процессе написания (через недельку другую будет готова).

Основные идеи по структуре хранения:
— есть товары (спецификациии)
— есть предложения (данные от магазинов)
— есть модели
-есть каталог

Все предложения от магазинов привязаны к спецификациям и/или к моделям.

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

И еще не забываем, что в ЯМ — есть куча контент-менеджеров, которые редактируют «спецификации товаров» и сильно облегчают «жизнь роботов».

Основные идеи поиска:
— строим индекс по каталогу, названиям, моделям,
-на каждый индекс делаем по запросу.
— в зависимости от полученных результатов делаем соответствующие вывод
— делаем анализ взаиморасположения поисковых слов
— параметры проходят полнотекстный поиск.

Честно говря я хотел пож этот проект сделать свой поисковик, но сил не хватит. Сперва надо запустить со Сфинксом.

Поддерживаю идею MongoDb как средство хранения информации и быстрого ее извлечение. C использованием MongoDb может быть маленькая проблема (кроме ограничения на размер данных в 2 Гб для 32 бит Ось ), которая выльится в большой геморой: пока индексатор Сфинкса на нее не написан. Я тоже собирался ее использовать, но пока остановился на мускуле.

На последней PHPConf был хороший доклад про использование Сфинкса по поиску миллиона товаров dostavka.ru ( у меня сайт агрегатор — было 2 миллиона) Видео есть на сайте PHPConf
Ответ написан
@ZOXEXIVO
MongoDB 3.4 поддерживает Faceted search
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы