首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL CONTAINSTABLE -意外结果

SQL CONTAINSTABLE -意外结果
EN

Stack Overflow用户
提问于 2020-11-18 18:44:29
回答 2查看 140关注 0票数 0

我有一个包含一些记录的表程序,如果使用LIKE或CONTAINSTABLE,结果就不同了。

代码语言:javascript
复制
CREATE TABLE Programs (
    ID varchar(255) NOT NULL PRIMARY KEY,
    Title varchar(255) NOT NULL
);

Insert INTO Programs VALUES 
('1', '5 Horas em Islamabad'), 
('2','Gus Melhoras" Melhora'), 
('3', '13 Horas - Os Soldados Secretos de Benghazi'),
('4','72 Horas de Medo'), 
('5','As Primeiras 48 Horas')

SELECT distinct Title FROM Programs WHERE Title LIKE '%Horas%'

SELECT ID, Title, KEY_TBL.RANK  
FROM Programs AS DocTable   
INNER JOIN CONTAINSTABLE(Programs, Title, 'Horas') AS KEY_TBL  
  ON DocTable.ID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 0  
ORDER BY KEY_TBL.RANK DESC;  

使用类似于,我有5个结果

代码语言:javascript
复制
ID  Title
1   5 Horas em Islamabad
2   Gus Melhoras" Melhora
3   13 Horas - Os Soldados Secretos de Benghazi
4   72 Horas de Medo
5   As Primeiras 48 Horas

关于ContainsTable,我有两个结果

代码语言:javascript
复制
ID  Title                   RANK
4   72 Horas de Medo        32
5   As Primeiras 48 Horas   32

我理解为什么标题为"Gus Melhoras“”Melhora“的唱片没有返回,因为没有" Horas”这个词。但是记录"5 Horas伊斯兰堡“和"13 Horas- Os Soldados Secretos de Benghazi”中包含"Horas“一词,不返回。

有谁能为这件事的发生提供帮助吗?

我的dbms是。

全文索引中使用的列

编辑

在我的例子中,我在“巴西语”中定义了“打破单词的语言”。如果我更改为“英语”正确返回4个项目。

我搜索"Horas“这个词在英语中是”小时“。但如果我加上这张新唱片,标题是“伊斯兰堡的13小时”,然后逐字搜索“小时”,记录就会被退回。

有人知道为什么在巴西语或葡萄牙语中有这种特殊的行为吗?

此外,在西班牙语中,"Horas“是同一个单词"Horas”,如果我将我的“word Breaker语言”改为西班牙语,则返回4个项目。

EDIT2

使用Marin中@Randy发送的查询,我用葡萄牙语做了测试。

代码语言:javascript
复制
SELECT s.stopword, l.name 
FROM sys.fulltext_system_stopwords s 
JOIN sys.fulltext_languages l ON l.lcid = s.language_id 
WHERE l.lcid = 2070 -- portuguese
代码语言:javascript
复制
stopword    name
0   Portuguese
1   Portuguese
2   Portuguese
3   Portuguese
4   Portuguese
5   Portuguese
6   Portuguese
7   Portuguese
8   Portuguese
9   Portuguese
a   Portuguese
agora   Portuguese
... 

当执行查询以找到准确匹配时

代码语言:javascript
复制
SELECT occurrence, special_term, left(display_term, 20) as [display_term] 
FROM sys.dm_fts_parser ('"5 Horas em Islamabad"', 2070, 0, 0); -- portuguese
代码语言:javascript
复制
occurrence  special_term    display_term
1   Exact Match tt24050000
1   Exact Match 5 horas
1   Exact Match tt24170000
2   Noise Word  em
3   Exact Match islamabad

这是与巴西语相同的结果,尽管有数字停止词

EN

回答 2

Stack Overflow用户

发布于 2020-11-24 17:33:01

dmv的sys.dm_fts_parser显示了一个短语是如何被解析为不同的语言,有或没有斯多普拉或重音。

代码语言:javascript
复制
SET NOCOUNT ON

--select * from sys.syslanguages

SELECT occurrence, special_term, left(display_term, 20) as [display_term] 
FROM sys.dm_fts_parser ('"5 Horas em Islamabad"', 1033, 0, 0); -- english

SELECT occurrence, special_term, left(display_term, 20) as [display_term] 
FROM sys.dm_fts_parser ('"5 Horas em Islamabad"', 1046, 0, 0); -- brazilian

SELECT occurrence, special_term, left(display_term, 20) as [display_term] 
FROM sys.dm_fts_parser ('"5 Horas em Islamabad"', 3082, 0, 0); -- spanish

occurrence  special_term     display_term
----------- ---------------- --------------------
1           Noise Word       5
1           Noise Word       nn5
2           Exact Match      horas
3           Exact Match      em
4           Exact Match      islamabad

occurrence  special_term     display_term
----------- ---------------- --------------------
1           Exact Match      tt24050000
1           Exact Match      5 horas
1           Exact Match      tt24170000
2           Noise Word       em
3           Exact Match      islamabad

occurrence  special_term     display_term
----------- ---------------- --------------------
1           Noise Word       5
1           Noise Word       nn5
2           Exact Match      horas
3           Exact Match      em
4           Exact Match      islamabad

在巴西语中,"5“不是一个噪音词。我尝试了null作为一个斯多普利主义者,同时0和1的口音,这没有帮助。

如果您运行以下两个查询,很明显,巴西的斯多普利特是非常不同的。它没有数字。也许它应该。也许需要打个支援电话。

代码语言:javascript
复制
SELECT s.stopword, l.name
FROM sys.fulltext_system_stopwords s
JOIN sys.fulltext_languages l
ON l.lcid = s.language_id
WHERE l.lcid = 1033

stopword
----------------------------------------------------------------
$
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
...

SELECT s.stopword, l.name
FROM sys.fulltext_system_stopwords s
JOIN sys.fulltext_languages l
ON l.lcid = s.language_id
WHERE l.lcid = 1046

stopword
----------------------------------------------------------------
a
abaixo
acaso
aceleradamente
acerca
acima
acolá
ademais
adentro
adiantado
adiante
adrede
afora
agora
agorinha
ainda
alerta
algo
algum
alguma
algumas
...
票数 0
EN

Stack Overflow用户

发布于 2020-11-25 20:06:15

相似和CONTAINSTABLE可能会有不同的结果。类似使用简单和确定的模式匹配规则和所有字符是重要的。CONTAINSTABLE使用一个复杂的系统,试图应用特定于语言的算法进行模糊匹配。

如果存储不同语言的文档,那么在CONTAINSTABLE中指定语言可以获得更好的结果。LCID可以存储在文档的记录中,并在联接中传递给CONTAINSTABLE。如果未指定,则使用全文的语言,并且可能不是很好的匹配。

代码语言:javascript
复制
SELECT ID, Title, KEY_TBL.RANK  
FROM Programs AS DocTable   
INNER JOIN CONTAINSTABLE(Programs, Title, 'Horas', 1046) AS KEY_TBL  
  ON DocTable.ID = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 0  
ORDER BY KEY_TBL.RANK DESC;

更新:这是一种检查值在哪种语言中是终止词的方法。

代码语言:javascript
复制
select * from sys.fulltext_system_stopwords
WHERE stopword IN ('5', 'em')

stopword                                                         language_id
---------------------------------------------------------------- -----------
5                                                                0
5                                                                1028
5                                                                1030
5                                                                1031
5                                                                1033
5                                                                1036
5                                                                1040
5                                                                1041
5                                                                1043
5                                                                1045
5                                                                1049
5                                                                1053
5                                                                1054
5                                                                1055
5                                                                2052
5                                                                2057
5                                                                2070
5                                                                3082
em                                                               1046
em                                                               2070
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64899370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档