我有一个包含一些记录的表程序,如果使用LIKE或CONTAINSTABLE,结果就不同了。
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个结果
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,我有两个结果
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发送的查询,我用葡萄牙语做了测试。
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 -- portuguesestopword 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
... 当执行查询以找到准确匹配时
SELECT occurrence, special_term, left(display_term, 20) as [display_term]
FROM sys.dm_fts_parser ('"5 Horas em Islamabad"', 2070, 0, 0); -- portugueseoccurrence 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这是与巴西语相同的结果,尽管有数字停止词
发布于 2020-11-24 17:33:01
dmv的sys.dm_fts_parser显示了一个短语是如何被解析为不同的语言,有或没有斯多普拉或重音。
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的口音,这没有帮助。
如果您运行以下两个查询,很明显,巴西的斯多普利特是非常不同的。它没有数字。也许它应该。也许需要打个支援电话。
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
...发布于 2020-11-25 20:06:15
相似和CONTAINSTABLE可能会有不同的结果。类似使用简单和确定的模式匹配规则和所有字符是重要的。CONTAINSTABLE使用一个复杂的系统,试图应用特定于语言的算法进行模糊匹配。
如果存储不同语言的文档,那么在CONTAINSTABLE中指定语言可以获得更好的结果。LCID可以存储在文档的记录中,并在联接中传递给CONTAINSTABLE。如果未指定,则使用全文的语言,并且可能不是很好的匹配。
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;更新:这是一种检查值在哪种语言中是终止词的方法。
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 2070https://stackoverflow.com/questions/64899370
复制相似问题