首页 > 解决方案 > 使用 CONTAINS 进行全文搜索

问题描述

我有以下记录:

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 步:创建全文索引

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在这两个表之间做。col2ft_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);  

错误:

消息 102,级别 15,状态 1,第 4 行 't1' 附近的语法不正确。

标签: sql-serversql-server-2008-r2full-text-search

解决方案


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) 

推荐阅读