Предложение тегов (не автозаполнение тегов) - PullRequest
2 голосов
/ 17 апреля 2010

Автозаполнение AJAX довольно просто реализовать. Тем не менее, мне интересно, как обрабатывать предложения смарт-тегов, как это на SO.

Чтобы уточнить разницу между автозаполнением и предложением :

  • автозаполнение : foo [foobar, foobaz]
  • предложение : foo [barfoo, foobar, foobaz] или, что еще лучше, с функцией «Вы имели в виду»: [barfoo, foobar, foobaz, fobar, fobaz]

Полагаю, мне нужен полнотекстовый поиск по тегам (индексируются все буквы, а не только слова). Не будет проблем сделать это с помощью регулярных выражений или других шаблонов для ограниченного числа тегов (даже на стороне клиента).

Но как реализовать эту функцию для большого количества тегов?
Есть ли какая-то конкретная причина (помимо URL), что теги на SO разделены тире? А как насчет символов Юникода в тегах?

Я храню теги в таблице со следующими столбцами: id, tagname. Мой запрос SQL возвращает объекты со следующими полями: id, tagname, count

(я использую Doctrine ORM и pgsql в качестве драйвера БД по умолчанию.)

1 Ответ

3 голосов
/ 18 апреля 2010

Я бы выбрал ВЫБОР их из базы данных с помощью REGEXP при каждом нажатии клавиши.Я сделал это на своих сайтах, и у меня не было проблем с предварительной версией (я не думал, что сервер сильно загружен).Если вам не нравится эта идея, я бы обналичил все 1-5 буквенных комбинаций, которые пользователи будут вводить и обновлять ежедневно в отдельной таблице.Если эта таблица проиндексирована, то у вас очень быстрая реализация.

Подробнее о втором подходе:

Вкратце: 1. Создайте таблицу SEARCHTABLE, представляющую 1-n отношения между ключевыми словами (ограничьте ее 3-4 буквами) и первичными идентификаторами тегов.2. ИНДЕКС на обоих полях.3. Каждый раз, когда пользователь выполняет поиск, смотрите на ПОИСК и, если есть комбинация, используйте это - очень быстро, так как все проиндексировано.Если нет, выполните поиск по регулярному выражению и поместите все результаты в ПОИСК.

Примечания:

  1. Вы должны сделать таблицу недействительной, если добавляете теги, но это должно происходить гораздо реже, чем поиск.При аннулировании таблицы вы не обязательно TRUNCATE, вы можете легко восстановить ее, принимая во внимание все ключевые слова.
  2. Если вы хотите ускорить ее, вы можете «сгенерировать» все два или даже три поиска букв.
  3. Если вам все равно, вы должны использовать информацию из n-1 буквенных ключевых слов для создания n буквенного ключевого слова.Это ускоряет вещи чрезвычайно.Представьте, что пользователь набрал «mo», и вы показали им соответствующий результат из SEARCHTABLE.Затем, когда она наберет «n» и передаст «mon», вам понадобится найти только выбранные элементы, чтобы сгенерировать новый ответ.

Надеюсь, теперь это стало более полным.

...