Я поделюсь своим опытом, как я это сделал, на моем предыдущем стартап-сайте сообщества Pageflakes. На Pageflakes пользовательский контент помечается. Вы можете увидеть пример здесь:
http://www.pageflakes.com/Community/Content/Flakes.aspx?moduleKey=4796
Каждый виджет подкачки имеет коллекцию тегов. Когда кто-то ищет, мы присваиваем тегам самый высокий приоритет, затем название, затем описание элемента.
Предположим, у вас есть таблица контента, подобная этой:
Content (id, title, description)
Прежде всего, вам нужно создать таблицу для всех уникальных тегов.
Tag (id, name (unique), countOfItems)
Затем вам нужно сопоставить тег со строками содержимого.
TagContentMap (tagid, contentid)
Теперь вы будете спрашивать, для каждого нового содержимого я должен вставить три таблицы. Не всегда. Вы вставляете в таблицу тегов только тогда, когда у вас есть новый тег. В большинстве случаев люди выбирают существующие теги. После нескольких месяцев тегов пользователи должны были исчерпать уникальные теги. С тех пор 99% времени пользователи выбирают какой-либо существующий тег. Таким образом, это удаляет одну вставку для вас. Итак, у вас есть только одна дополнительная вставка.
Кроме того, вставка всегда значительно ниже, чем выбор. Скорее всего, у вас будет 99% прочитанного, 1% записанного.
Если вы не представите эти две таблицы, у вас никогда не будет пользовательского интерфейса, в котором пользователи смогут щелкнуть тег и увидеть весь контент, отмеченный этим конкретным тегом. Если вам не нужна такая функция, то, конечно, вы можете просто добавить столбец «теги» в самой таблице содержимого и сохранить теги в формате с разделителями-запятыми.
Теперь самый важный момент - как получить лучший результат поиска. В таблице содержимого у нас есть поле varchar с именем «SearchData». Это поле сначала заполняется именами тегов, затем заголовком и описанием. Таким образом,
SearchData = tag names comma delimited + newline + title + newline + description.
Затем вы используете полнотекстовое индексирование SQL Server для индексации только столбца SearchData, а не любого другого поля в таблице содержимого.
Это у вас работает?