Текстовый запрос с полным поиском

Я хочу добавить в свое веб-приложение простой полнотекстовый поиск, который может принимать несколько слов для поиска.
Пример поиска: "Онлайн-книги по SQL"

Должен ли я преобразовать его в:

WHERE (CONTAINS(myColumn,  '"Online*" and "sql*" and "books*"' ))  
or : WHERE (CONTAINS(myColumn,  '"Online* sql* books*"' ))  
or maybe: WHERE (CONTAINS(myColumn,  '"Online*"' ))  and (CONTAINS(myColumn,  '"SQL*"' ))  and (CONTAINS(myColumn,  '"books*"' ))    

или, может быть, лучше использовать 'FORMSOF(INFLECTIONAL('...

Другой вопрос, где лучше построить запрос внутри процедуры хранения внутри моего бизнес-объекта, а затем передать его хранимой процедуре?


person markiz    schedule 14.08.2009    source источник


Ответы (2)


Первая форма хорошо (CONTAINS(myColumn, '"Online*" и "sql*" и "books*"' )) - sql все равно потратил время на разбор запроса.

Второй вопрос касается удобства. Если вы хорошо разбираетесь в манипуляциях со строками в sql2005, сделайте это. Но помните о проблеме с sql-инъекциями, поэтому проверьте дважды.

person Dewfy    schedule 14.08.2009
comment
да sql-инъекция важна, так что безопаснее и быстрее будет? - person markiz; 14.08.2009
comment
Я думаю, что лучше построить его внутри вашего бизнес-объекта, если вместо вашей хранимой процедуры, поскольку вы будете создавать дополнительные накладные расходы, создавая переменные и объединяя значения и т. д. внутри вашего хранимого процесса (и, как правило, это не очень хорошая практика). Просто убедитесь, что вы санируете строку sql, чтобы избежать инъекции sql, как заявил Dewfy. - person Mr. Smith; 14.08.2009
comment
@Benjamin&Dewfy, что мне делать (или не делать), чтобы предотвратить внедрение sql? - person markiz; 14.08.2009
comment
Вы можете начать с проверки того, что строка, которую вы передаете, не содержит символа ', или, по крайней мере, экранирует его. Если вы этого не сделаете, вы можете столкнуться с тем, что кто-то удалит всю вашу базу данных в зависимости от безопасности. - person Mr. Smith; 14.08.2009
comment
@Benjamin, достаточно ли этого: content = Regex.Replace(content, [^A-Za-z0-9], ).Trim(); ? - person markiz; 14.08.2009
comment
@markiz не согласен с тем, что цитата () является важной частью запросов FTS, поэтому включите ее также и проверьте, что всегда есть пара - person Dewfy; 14.08.2009
comment
@Dewfy, я добавляю () в строку ПОСЛЕ замены регулярного выражения, сначала я очищаю строку от нестандартных символов, а затем объединяю каждое слово в строке с и * в конце. - person markiz; 15.08.2009

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

Чтобы противостоять этим двум проблемам, был создан сайт Lucene.net, позволяющий просто создать подходящее слово. к указателю записей. При этом он также может видеть, как часто слова используются в определенных записях, и предоставлять информацию о ранжировании. Вы обнаружите, что он значительно превосходит использование SQL для этой задачи, как с точки зрения поиска результатов, так и скорости выполнения отдельных поисков и особенно при масштабировании для поддержки большего количества поисков.

person Paul Keeble    schedule 14.08.2009