Оптимизация поиска SQL с использованием столбца для ключевых слов и переменной в качестве текста для поиска

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

Единственный известный мне способ сделать это — выбрать каждую строку столбца по одной, а затем использовать оператор LIKE с подстановочными знаками с каждой стороны, чтобы увидеть, встречается ли ключевое слово из столбца где-либо в тексте внутри строки. Переменная. Каждый способ, которым я пытаюсь это сделать, в конечном итоге кажется ОЧЕНЬ неэффективным.

Еще один способ взглянуть на это так: если бы я мог изменить порядок операций, таких как FREETEXT, на выполнение чего-то вроде FREETEXT(@input, keywords), это было бы здорово. Но я просто не могу найти способ сделать это просто и эффективно.

Любые советы о том, как сделать это максимально эффективно? Я очень благодарна за помощь!

Редактировать:

Вот моя хранимая процедура, для справки:

GO
    @input varchar(1000),
    @debug varchar(25) output

AS
BEGIN

    SELECT TOP 1 @debug = kw.keyword
    FROM (SELECT @input input) bigstring
    INNER JOIN table1 kw 
    on bigstring.input LIKE '%' + kw.keyword + '%'

END

person Joshua    schedule 10.11.2011    source источник


Ответы (1)


Вот два способа в зависимости от того, что вы хотите сделать (при условии, что SQL 2005+ из ключевого слова FREETEXT). Первый выбор после выборочных данных возвращает индекс ключевого слова (отфильтруйте нули, если вы не хотите, чтобы ключевые слова не были найдены). Второй просто проверяет наличие

Declare @keywords  as table (keyword varchar(50))
INSERT INTO @keywords 
VALUES ('quandary'),
       ('variable'),
       ('paragraph'),
       ('Narwhal')


DECLARE @input as varchar(max)
SET @input = 'Heres my quandary. I have a variable that contains a paragraph of text, and I have a column full of keywords. I want to search each of the keywords contained in the column against the entirety of the text contained within my variable'


SELECT keyword, CHARINDEX(keyword, @input , 0)
FROM @keywords

SELECT kw.keyword
FROM 
(SELECT @input input) bigstring
INNER JOIN @keywords kw 
on bigstring.input like '%' + kw.keyword + '%'



(4 row(s) affected)
keyword                                            
----------------------- --------------------
quandary                10
variable                29
paragraph               54
Narwhal                 0

(4 row(s) affected)

keyword
-----------------------
quandary
variable
paragraph

(3 row(s) affected)

Я не удивлюсь, если есть решение CROSS APPLY.

Обновить Получение только первого ключевого слова в качестве выходного параметра

Данные

CREATE TABLE table1 (keyword varchar(50))
INSERT INTO table1 
VALUES ('quandary'),
       ('variable'),
       ('paragraph'),
       ('Narwhal')

GO

Проц

CREATE  proc testKeyword
        @input varchar(1000),
        @debug varchar(25) output

    AS
    BEGIN

        SELECT TOP 1 @debug = kw.keyword
        FROM (SELECT @input input) bigstring
        INNER JOIN table1 kw 
        on bigstring.input LIKE '%' + kw.keyword + '%'

    END

Контрольная работа

DECLARE @debug varchar(25)
EXEC testKeyword 'Heres my quandary. I have a variable that contains a paragraph of text, and I have a column full of keywords. I want to search each of the keywords contained in the column against the entirety of the text contained within my variable',
           @debug out 

SELECT @debug 

outputs 


-------------------------
quandary

(1 row(s) affected)
person Conrad Frix    schedule 10.11.2011
comment
Каков тип входной переменной и таблицы ключевых слов? Также то, что не работает, означает, например. Нет записей, ошибка? - person Conrad Frix; 11.11.2011
comment
Второй запрос выглядит великолепно, и когда я выполняю его так, как вы его написали, он работает нормально, но когда я добавляю его в свою хранимую процедуру и передаю входную переменную из внешнего источника, он не работает. Нужно ли мне настраивать способ обработки входной переменной, если она не жестко запрограммирована непосредственно над оператором select? Вот код, который я закинул в SP, пытаясь установить переменную отладки в первое найденное ключевое слово: SELECT TOP 1 @debug = kw.location FROM (SELECT @input input) bigstring INNER JOIN table1 kw on bigstring.input like '%' + kw.location + '%' - person Joshua; 11.11.2011
comment
Под не работает я подразумеваю, что когда я вставляю код в свою хранимую процедуру, используя тот же ввод и ключевые слова, он никогда не находит соответствия. Надеюсь это имеет смысл? При этом никаких ошибок. - person Joshua; 11.11.2011
comment
Возможно, это помогло бы, если бы я вставил свой SP ... Сейчас я добавляю это к своему OP. - person Joshua; 11.11.2011
comment
Если я использую SELECT @debug = count(kw.keyword), это работает так, как я ожидаю... Так что, может быть, я сделал что-то не так с ВЕРХНИМ битом? Но это работает вне хранимой процедуры, так что я действительно потерялся. - person Joshua; 11.11.2011
comment
SELECT TOP 1 @debug = kw.keyword помещает первый результат в @debug. Вы можете сделать SELECT @Debug, чтобы увидеть значение. Какой результат вы ищете - person Conrad Frix; 11.11.2011
comment
Я пытался заставить переменную отладки отправлять ключевое слово, соответствующее вводу, из моей хранимой процедуры в другую программу. Это РАБОТАЕТ, когда я выполняю код как отдельный, и он также работает, чтобы использовать count вместо top, но по какой-то причине, когда я пытаюсь назначить переменную отладки ключевому слову top в моей хранимой процедуре, это когда он никогда не срабатывает что-нибудь вне. - person Joshua; 11.11.2011
comment
Хорошо, это сработало для меня. Я обновил свой ответ, чтобы включить тест - person Conrad Frix; 11.11.2011
comment
давайте продолжим это обсуждение в чате - person Joshua; 11.11.2011