Функция TSQL для анализа текста на основе ключевых слов?

Мне нужна помощь в создании функции релевантности текста с использованием списка ключевых слов, который входит в sproc SQL Server 2008, и я выполняю поиск по произвольному тексту, который возвращает список строк таблицы.

Для каждой строки мне нужна функция, скажем, "ParseForKeywords(result, listOfKeywords) AS Parsed Result", для построения новой строки на основе поля результата:

listOfkeywords будет списком слов, разделенных запятыми или пробелами.

Если результат больше, чем, скажем, 100 слов, выполните следующие действия: Найдите первое вхождение любого из ключевых слов, вычтите 5 или 6 слов и начните новую строку оттуда на длину строки результата.

Если результат больше 200 слов, сделайте то же самое, что и выше, для следующих 50 слов, затем найдите следующее вхождение любого из ключевых слов, минус 5 или 6 слов, и добавьте «…».

То, что я ищу, является отправной точкой и небольшим советом о том, где эта логика будет лучше всего размещена: на SQL Server или позволить коду .Net делать это при заполнении ячейки DataTable?

Если делать это в функции TSQL: я бы начал с создания курсора или CTE для циклического просмотра списка слов с разделителями-запятыми. На каждом проходе. Чтобы найти первое вхождение любого из слов, мне пришлось бы перебирать количество ключевых слов, чтобы найти наименьшее значение CHARINDEX().

Есть ли способ сделать ГДЕ В ('слово1', 'слово2', 'слово3') ??

Как только это будет найдено, я вычту x # символов из этого значения charindex, пока не посчитаю, скажем, 4 пробела. Мне также нужно было бы увидеть, встречается ли какое-либо из этих слов позже в тексте, и в этот момент весь процесс повторяется.

Глядя на это сейчас, для этого потребуются как минимум две функции.

Спасибо.


person ElHaix    schedule 07.06.2011    source источник
comment
Обычно люди не любят писать полноценные рабочие функции по запросу. Сообщество может помочь вам отладить и спроектировать вашу функцию, когда у нас будет над чем работать. Опубликуйте, что у вас есть на данный момент, пожалуйста.   -  person Brent D    schedule 07.06.2011
comment
Сколько именно в час вы собираетесь платить мне за это?   -  person HLGEM    schedule 08.06.2011
comment
На самом деле я искал отправную точку. У меня было время подумать об этом, и я добавил свои заметки выше, и хотел бы получить совет по этому поводу.   -  person ElHaix    schedule 08.06.2011


Ответы (3)


Вариант 1. Поместите эту логику в код, который будет вызываться после выполнения запроса. Добавьте в результаты новый столбец, содержащий значения ParseForKeywords.

Это более простая реализация, но она будет работать плохо, если вы разбиваете результаты на страницы, потому что ParseForKeywords будет выполняться для каждого результата.

Вариант 2. Создайте функцию CLR и запустите ParseForKeywords в запросе.

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

person Keith    schedule 08.06.2011
comment
Кит, да, это напоминает мне, что я рассматривал возможность добавления пустого столбца к результатам и выполнения обработки при заполнении строк. В конце концов, может быть проще кодировать его на C#, чем делать это с помощью TSQL. Что касается подкачки, я использую MVC, поэтому я буду запрашивать, скажем, 10 записей за раз. - person ElHaix; 08.06.2011

Лучше всего для такой задачи подходит написание CLR StoredProcedure. Примеров и руководств в интернете предостаточно.

person ba__friend    schedule 08.06.2011
comment
Это путь. На самом деле обработка строк — один из лучших вариантов использования CLR в SQL Server. - person Yuck; 08.06.2011

SQL на самом деле очень плохое место для анализа текста по ключевым словам, если вы не используете полнотекстовое индексирование. Вот хороший обзор:

http://www.simple-talk.com/sql/learn-sql-server/understanding-full-text-indexing-in-sql-server/

Без создания полнотекстового индекса ваши запросы должны анализировать каждую строку, по которой вы ищете, линейно, что делает эту операцию потенциально очень медленной, особенно если у вас много строк для поиска.

Другой вариант — использовать такой пакет, как lucene, и выполнять полнотекстовый поиск вне базы данных.

person Joe Enzminger    schedule 08.06.2011
comment
Джо, на самом деле я использую полнотекстовое индексирование, поскольку я выполняю поиск с использованием CONTAINS, но, как указано выше, я могу пойти по пути реализации этой логики при заполнении строк данных. - person ElHaix; 08.06.2011