Pull to refresh

Алгоритмы организации тэгов

Reading time3 min
Views27K
Тэги – неотъемлемая часть всех современных сайтов и косвенный признак принадлежности сайта к пресловутому Вэб-Два-Ноль.

В статье я хочу рассказать об способах и алгоритмах тегирования информации.

Итак, при организации тэгов существует несколько слабых и узких мест, а именно:
  • добавление и изменение принадлежности тэгов к объекту.
  • создание и изменение самих тэгов.
  • отображение тэгов на старице.
  • поиск по тэгам.
  • назначение алиасов тега
  • построение облака тегов

К сожалению, универсальный алгоритм, который легко бы решал все эти проблемы автору не знаком. Далее о самих алгоритмах.

Нормальное соотношение многое-ко-многим.


Существует огромная таблица с тэгами, существуют огромные таблицы с тегируемой информацией. Связь между ними осуществляется через третью таблицу, которая получается очень большого размера. Так, если статей у нас 50000, а тэгов 10000, при условии что каждая статья в среднем связана с 4-мя тэгами, получаем размер таблицы в 200000.

Плюсы:
  • нет проблем с построением облака тэгов
  • нет проблем с алиасами.
  • нет проблем с созданием и изменением тэгов
  • нет проблем с «выпадающим списком тэгов»
Минусы:
  • добавление и изменение принадлежности тэгов к объекту затрудненно, поскольку требуется отдельный INSERT или DELETE на каждую изменяемую связь. Еще нужен INSERT при создании тэга. Если некоторые тэги в единственном числе (что часто бывает), то они будут оттягивать на себя ресурсы (увеличивая размеры таблиц), не неся при этом почти никакой практической пользы.
  • получение и отображение тэгов требует JOIN-объединение 3-х огромных таблиц. Из примера выше: таблица в 50000 join таблица 200000 join таблица 10000. Это будет работать медленно уже с этими данными. Учитывая то, что реально требуется сделать join еще 2-3 большие таблицы (например, таблицу пользоватлей и таблицу рейтинга), получается совсем не радужная картина. Да, я в курсе, что можно кэшировать, но сейчас не об этом.
  • поиск по тэгам требует опять объединения больших таблиц

С помощью полнотекстового поиска


Алгоритм приведен в моей статье «Полнотекстовый поиск и его возможности»

Теперь о том, как это делается непосредственно по отношению к тэгам. В поле с полнотекстовым индексом лежат сами тэги в том виде, как они были записаны. Выборка объектов происходит исключительно по этому полю. Исходя из этого же поля строится принадлежность объекта к тэгам. Это означает, что если тэг русский, то и ссылка на него должна содержать русские буквы. А с этим возникают проблемы, т.к. они могут кодироваться c помощью urlencode, а это зависит уже от кодировки. Т.е. один и тот же тэг в зависимости от того, в какой кодировки страница, должен быть декодирован по-разному. Можно конечно использовать транслит русских слов в английские, и в писать их в поле наряду с русским словами. Тогда тэг будет отображаться на русском, а ссылка на него будет в латинице, и поиск будет идти тоже в латинице. Плохой выход, но выход.

Плюсы:
  • нет проблем с выводом тэгов
  • нет проблем с поиском по тэгам
  • нет проблем добавлением и изменением принадлежности тэгов к объекту
  • нет проблем с алиасами (точнее есть, но они решаемы)
  • отпадает проблема создания тэга
  • легко можно делать поиск не по одному, а по нескольким тэгам, а так же вычислять похожие материалы
Минусы:
  • переименовать или удалить тэг просто так не получится, это требуется в полях всех объектов, которыми назначены тэги
  • с построением облака тегов очень большие проблемы. Можно решить так: обрабатываются все «тэговые» поля таблиц, анализируется частота присутствия отдельного тэга (эх, был бы доступ непосредственно к самому полнотекстовому индексу, как было бы хорошо) и на фоне этого строится облако. После чего кэшируется на длительный промежуток времени.
  • сложно сделать «выпадающий список тэгов»
Как вариант, совмещение того и другого метода. То есть поиск по полнотекстовому индексу, а частоты использования и сами тэги в отдельной таблице. Ну, или вариации на эту же тему. Это решает проблемы с выпадающим списком и облаком, но создает сложности при выводе, добавлении и создании тегов.

Если кто-то знает еще варианты организации – будет интересно о них узнать. Конструктивная критика приветствуется.
Tags:
Hubs:
+36
Comments48

Articles

Change theme settings