Комплексная концепция обработки URL

В настоящее время я борюсь со сложным вопросом о концепции обработки URL. Приложение имеет таблицу / коллекцию базы данных свойств продукта со всеми различными типами продуктов (т.е. категориями, цветами, производителями, материалами и т. Д.).

{_id:1,alias:"mercedes-benz",type:"brand"},
{_id:2,alias:"suv-cars",type:"category"},
{_id:3,alias:"cars",type:"category"},
{_‌​id:4,alias:"toyota",type:"manufacturer"},
{_id:5,alias:"red",type:"color"},
{_id:6,alias:"yellow",type:"color"},
{_id:7,alias:"bmw",type:"manufacturer"},
{_id:8,alias:"leather",type:"material"}
...

Теперь задача состоит в том, чтобы обрабатывать URL-запросы в указанном ниже стиле в каждом (!) Возможном порядке, чтобы получить включенные свойства продукта. Единственным разрешенным символом является тире (установленное требование SEO, некоторые свойства также могут включать тире сами по себе - я думаю, что это также важный момент - то есть категория "внедорожники" или производитель "mercedes-benz"):

http:\\www.example.com\{category}-{color}-{manufacturer}-{material}
http:\\www.example.com\{color}-{manufacturer}
http:\\www.example.com\{color}-{category}-{material}-{manufacturer}
http:\\www.example.com\{category}-{color}-nonexistingproperty-{manufacturer}
http:\\www.example.com\{color}-{category}-{manufacturer}
http:\\www.example.com\{manufacturer}
http:\\www.example.com\{manufacturer}-{category}-{color}-{material}
http:\\www.example.com\{category}
http:\\www.example.com\{manufacturer}-nonexistingproperty-{category}-{color}-{material}
http:\\www.example.com\{color}-crap-{manufacturer}
...

... так: каждый порядок свойств должен быть разрешен! Результатом должна быть информация об использованных свойствах для каждого URL-запроса (кстати, дублированный контент будет исправлен с помощью перенаправлений и предопределенной схемы). Возможные "несуществующие свойства"/"дерьмо" просто игнорируются.

ОБНОВИТЬ:

Идея 1: Один из способов размышления над вопросом - разделить строку запроса по тире и проанализировать их значение по значению. Проблема: при двух, трех или более словосочетаниях в некоторых свойствах слишком много разных комбинаций и вариаций. так что я думаю, что мы получаем множество запросов, которые убивают эту идею.

Идея 2: Другой способ - создать (на мой взгляд) слишком большую таблицу псевдонимов /URL-адресов со всеми различными комбинациями, но я думаю, что это просто уродливый обходной путь. Существует около 15.000 различных свойств, поэтому подсчет псевдонимов в разных порядках сортировки убивает эту идею.

Идея 3: Твоя очередь! Спасибо за ваш ум и ваше время.

2 ответа

Решение

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

Я подумал о вашей проблеме, рассматривая URL как список ключевых слов.

  • используйте Lucene в качестве системы ключевых слов / тегов. Он хорошо подходит для типов поиска, которые вы предлагаете, включая фразы, основы и т. Д.
  • храните и индексируйте данные в выбранной БД, но извлекайте ключевые слова в память и формируйте битовый индекс всех ключевых слов и элементов. Перебирайте таблицу ключевых слов, получая взвешенные результаты. Если порядок ключевых слов имеет значение, вам также нужно будет пройти через набор результатов к весу на основе порядка слов. Эти типы поисков всегда должны быстро ограничивать набор результатов, чтобы быстро возвращать результаты.
  • кэшируйте результаты как сумасшедшие от рабочих совпадений и отдавайте предпочтение результатам, которые пользователи, по-видимому, нажимают чаще всего для данного URL.
  • атаковать базу данных с помощью индексов тегов в MongoDB. Вам все равно нужно объединить и оценить результаты. Очень интенсивное и вряд ли хорошее использование ресурсов БД.
  • прочитайте некоторые из академических работ по поиску ключевых слов. Это популярная тема.
  • создайте таблицу слов, в которой есть тире, и нормализуйте / преобразуйте их перед выполнением запросов
  • всегда проверяйте на полное точное соответствие сначала

Единственный способ, которым это может работать, если вы ограничите все значения свойств, чтобы они были уникальными. Итак, вы делаете набор категорий + цвета + производители и т. Д. Все значения должны быть уникальными. Это позволит вам определить, какому свойству принадлежит значение. Структура данных для этого должна быть довольно простой:

{_id:ValueOfTheProperty, Property:TypeOfProperty}

Вот несколько возможных образцов:

{ _id: Red, Property: Color }
{ _id: Green, Property: Color }
{ _id: Boots, Property: Category }
{ _id: Shoes, Property: Category }
...

Таким образом, порядок не имеет значения, и вы можете конвертировать их за один проход на карту:

{ Color: Red, Category: Boots }

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

Другие вопросы по тегам