Задать вопрос
summoner2015
@summoner2015
Backend всему голова

Каким образом организовать поиск по сайту на Symfony?

Всем добрый день.
Собственно вопрос почти весь выше. Только начал разбираться с Symfony, и хотелось бы узнать есть ли "серебряная пуля" в плане организации поиска на сайте?
Т.к. материалы на сайте чаще всего это разные сущности в разных таблицах, каким образом можно их индексировать так, что бы при добавлении новой сущности свести доработку поиска к минимуму?
  • Вопрос задан
  • 341 просмотр
Подписаться 2 Простой Комментировать
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
1) использовать один из движков поиска (sphinx, ElasticSearch). Есть готовые бандлы, помогающие использовать эти движки в symfony-проекте.
2) либо сделать самому кучу поисков по нужным сущностям, можно сделать UNION запрос:
SELECT id, title, 'article' as `type` FROM Article WHERE ...
UNION SELECT id, title, 'news' as `type` FROM News WHERE ...
UNION SELECT id, title, 'post' as `type` FROM Post WHERE ...

да, второй способ без индексирования. Зато простой :), если поиск нужен "для галочки". Если нужен нормальный поиск с хорошей произодительностью, то используй первый способ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
s0lar
@s0lar
Организовывать поиск внутри приложения, по имеющимся сущностям - это не реально, мне кажется. По каким полям искать? Как ранжировать результаты?

Лучше пойти путем "краулеров" от поисковых систем, которые сканируют и собирают контент, обходя сайт как поисковый робот. Все результаты можно уместить в 1 таблице вида:
link, title, content, last_update

У Симфони есть мощный инструмент commands, с помощью которого можно создавать консольные приложения.
Я бы пошел путем написания "краулера" которого можно запускать по крону. Краулер будет сканировать ваш же сайт и индексировать контент. У Симфони так же есть DomCrawler компонент, которым легко выбрать все ссылки на странице, а так же собрать текстовый контент. Текстовый контент можно помещать в специальный тег (например ) или просто классом, чтобы не парсить все подряд.
Алгоритм примерно такой:
1. парсим "/"
2. сохраняем контент из тега
3. сохраняем все новые ссылки (исключая внешние ссылки и pdf, doc, etc) в табличке.
4. парсим следующую запись из нашей таблицы.

Таким образом обходим весь сайт по крону.

P.S.
Я бы еще поискал готовые бандлы, наверняка они есть.
Ответ написан
Ваш ответ на вопрос

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

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