Полнотекстовый поиск с использованием CONTAINS - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующие записи:

create table ft_test1
(
    col1 int identity(1,1),
    col2 varchar(max)
);

insert into ft_test1 values('John A Henry');
insert into ft_test1 values('Dsouza mak Dee');
insert into ft_test1 values('Smith Ashla Don');

create table ft_test2
(
    col1 int identity(1,1),
    col2 varchar(max)
);

insert into ft_test2 values('Mak');
insert into ft_test2 values('McKoy Obee Zen');
insert into ft_test2 values('Henry A John');

ИНДЕКС ПОЛНОГО ТЕКСТА Настройка:

Шаг 1: Создание уникального индекса

CREATE UNIQUE INDEX UIX_test1_Col1 ON ft_test1(col1);
CREATE UNIQUE INDEX UIX_test2_Col1 ON ft_test2(col1);

Шаг 2: Создание каталога

CREATE FULLTEXT CATALOG cat_ft
WITH ACCENT_SENSITIVITY = OFF

Шаг 3: Создание ИНДЕКСА FULLTEXT

CREATE FULLTEXT INDEX ON ft_test1  
(col2 LANGUAGE 1033)  
KEY INDEX UIX_test1_Col1  
ON cat_ft  
WITH STOPLIST = SYSTEM

CREATE FULLTEXT INDEX ON ft_test2  
(col2 LANGUAGE 1033)  
KEY INDEX UIX_test2_Col1  
ON cat_ft  
WITH STOPLIST = SYSTEM  

Запрос: Я хочу сделать JOIN между этими двумя таблицами путем сопоставления значений col2 и возврата значений таблицы ft_test1.

Ожидаемый результат:

col2
------------
Dsouza mak Dee
John A Henry

Объяснение относительно ожидаемого результата:

  1. Первая запись должна отображаться, поскольку mak присутствует в обеих таблицах в col2
  2. Вторая запись также присутствует, но с перемешиванием.

Попробуйте:

SELECT t1.col2
FROM ft_test1 t1
INNER JOIN ft_test2 t2
ON CONTAINS(t2.col2, t1.col2);  

Ошибка:

Msg 102,Уровень 15, состояние 1, строка 4 Неверный синтаксис рядом с 't1'.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Использование ft_test2 для построения поискового запроса:

Declare @vals varchar(1000) = '';
Select @Vals = @Vals + Case When @Vals = '' Then '"'+col2+'"' Else ' OR ' + '"'+col2+'"' End
From ft_test2;

Select * From ft_test1  where FreeText(col2, @Vals);  
0 голосов
/ 24 декабря 2018

CONTAINS не делает то, что вы хотите.FREETEXT ближе и возвращает желаемые результаты в этом случае.

Вам следует проверить документацию , чтобы увидеть, приемлема ли полная семантика.

Вам также потребуетсявспомогательный TVF, как показано ниже.

CREATE FUNCTION F1(@SearchText VARCHAR(8000))
RETURNS @ft_test2 TABLE (
  col1 INT,
  col2 VARCHAR(max))
AS
  BEGIN
      INSERT INTO @ft_test2
      SELECT *
      FROM   ft_test2 t2
      WHERE  FREETEXT (t2.col2, @SearchText)

      RETURN
  END

GO

SELECT t1.col2
FROM   ft_test1 t1
       CROSS APPLY F1(t1.col2) 
...