Предложение тегов (не автозаполнение тегов)


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

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

  • автозаполнение : foo [foobar, foobaz]
  • предложение: фу [barfoo, фрагментик, foobaz], или даже лучше, С 'ты имел в виду' характеристика: [barfoo, фрагментик, foobaz, fobar, fobaz]

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

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

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

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

1 2

1 ответ:

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

Подробнее о втором приложении:

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

Примечания:

  1. вы должны аннулировать таблицу, если вы добавляете теги, но этого должно быть много реже, чем обыск. Когда аннулирование таблицы вы делаете нет обязательно УСЕКИТЕ его, вы можете легко восстановить его взяв все ключевые слова в расчет.
  2. Если вы хотите ускорить его, вы можете "предварительно генерировать" все два или даже три письма ищет.
  3. Если вы достаточно заботитесь, вы должны использовать информацию из N-1 буквенных слов для генерации ключевое слово n букв. Это невероятно ускоряет процесс. Представьте, что пользователь набрал "mo" и вы показали им соответствующий результат из SEARCHTABLE. Чем когда она печатает "Н" давая ему "пн" вам нужно только поиск через уже выбранных элементов для создания новых ответ.

Надеюсь, что теперь она более всеобъемлюща.