sql-server - 使用 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
在这两个表之间做。col2
ft_test1
预期输出:
col2
------------
Dsouza mak Dee
John A Henry
关于预期输出的解释:
- 第一条记录应该显示因为
mak
存在于两个表中col2
- 第二个记录也存在,但有洗牌。
尝试:
SELECT t1.col2
FROM ft_test1 t1
INNER JOIN ft_test2 t2
ON CONTAINS(t2.col2, t1.col2);
错误:
消息 102,级别 15,状态 1,第 4 行 't1' 附近的语法不正确。
解决方案
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)
推荐阅读
- excel - 如何为打开时删除/重新创建的工作表存储 PT 更新事件?
- python-3.x - 这里有什么问题?为什么它不应该显示类型错误?
- swift - 为什么我在尝试仅在 tvOS 目标上使用 Apple 登录时收到错误 7014
- mysql - 如何在mysql中将列转换为数组?
- java - 使用 Java Lambda 表达式并行查询 DynamoDb GSI
- c# - 如何在我的控制台和 wpf 应用程序之间使用非对称加密?
- spring-boot - 容器化 Spring Boot 应用程序中的 AJP 不起作用
- sql - 如何使用 PL/SQL 迭代输入变量
- java - 单击 24 小时版本时,TimePicker 错误地选择了同一时间的 12 小时版本
- csv - 将 csv 导入 Neo4j,其中多列有空单元格