Оптимизация поиска SQL с использованием столбца для ключевых слов и переменной в качестве текста для поиска - PullRequest
0 голосов
/ 10 ноября 2011

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

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

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

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

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

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

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

1 Ответ

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

Вот два способа, в зависимости от того, что вы хотите сделать (предполагая 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

Proc

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)
...