Как обрабатывать «поиск по ключевым словам» с помощью хранимой процедуры? - PullRequest
2 голосов
/ 15 сентября 2011

Я создаю приложение типа FAQ для самостоятельной помощи, и одно из требований заключается в том, что конечный пользователь должен иметь возможность искать разделы часто задаваемых вопросов.У меня есть три модели заметок, перечисленные ниже с соответствующими (то есть доступными для поиска) столбцами:

Topic: Name, Description
Question: Name, Answer
Problem: Name, Solution

Все три таблицы связаны с Темой через столбец TopicID.Идея состоит в том, чтобы предоставить одно текстовое поле, в котором пользователь может ввести поисковый запрос, что-либо в виде предложения (например, «Как я выполняю X») или фразы (например, «Выполнение X» или «Выполнить X»), и предоставитьвсе темы / вопросы / проблемы, в которых есть любое из слов, введенных в полях имени или описания / ответа / решения;в модели будут доступны только те столбцы с возможностью поиска, и мне не нужно беспокоиться о фильтрации общих слов, таких как «как» и тому подобное (это было бы неплохо, но не является обязательным требованием, поскольку это не точное совпадение, а нечеткое совпадение).

По причинам, не зависящим от меня, я должен использовать хранимую процедуру.Мой вопрос заключается в том, что было бы наиболее подходящим способом для поиска, подобного этому;Я видел похожие вопросы относительно нескольких столбцов, но на самом деле не существует переменного числа столбцов, всегда есть два столбца в таблице, которые действительно доступны для поиска.Проблема в том, что поисковый запрос теоретически может быть почти любым - предложение, фраза, список терминов, разделенных запятыми (например, «x, y, z»), поэтому мне придется разделить поисковый термин на:компоненты (например, разделить на пустое пространство), а затем искать каждую пару столбцов для каждого термина?Это достаточно легко сделать в SQL Server?Альтернатива, немного более сложная, состоит в том, чтобы просто извлечь все данные обратно, а затем разделить запрос и отфильтровать результаты в коде на стороне сервера, поскольку не должно быть , что введено много элементов, но ячувствовал бы себя немного грязным, делая что-то подобное; -)

1 Ответ

1 голос
/ 26 ноября 2011

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

Затем вы можете запросить этот каталог, используя предикат FREETEXT. Похоже, вам нужно сопоставить эти суффиксы, такие как 'ing', поэтому предложите FREETEXT более CONTAINS в этом случае.

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

declare @token varchar(256);
select @token = 'perform';

select * from Problem
where   freetext(Name, @token)
or      freetext(Solution, @token);
--this will match 'perform' and 'performing' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...