我已经根据系统列表创建了一个停止列表,并设置了我的全文索引来使用它。
如果我运行代码select unique_index_id, stoplist_id from sys.fulltext_indexes
,我可以看到我的所有索引都使用ID为5的停止列表,这是我创建的。
当我使用FTS_PARTIAL运行文本时,结果是正确的。 例如:
SELECT special_term, display_term
FROM sys.dm_fts_parser
(' "Rua José do Patrocinio nº125, Vila América, Santo André - SP" ', 1046, 5, 0)
我添加到停止列表中的单词显示为噪音词。但由于某些原因,当我运行我的查询时,它也会给我带来包含停用词的寄存器。
例如:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"rua*" or "jose*"')
按照我的预期给我上面的注册表。由于“rua”这个词应该被忽略,但“Jose”会匹配。
但如果我搜查了:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"rua*"')
我希望找不到寄存器。因为'rua'被设置为禁用词。
我使用巴西语(葡萄牙语)作为停止语言。 所以应该忽略“Rua”(意思是“街道”)这个词(因为我将它添加到停止列表中)。它被解析器识别为噪声,但是当我运行查询时,它会给我带来包含“Rua”的寄存器。
我的搜索是一个地址搜索,因此它应该忽略诸如“街道”,“大道”等字样。(当然是葡萄牙语,我也将它们全部加入)。
这是我用来查找表格的查询。
select DISTINCT(PES.idPessoa)
, PES.Nome
, EN.idEndereco
, EN.idUF
, CID.Nome as Cidade
, EN.Bairro
, EN.Logradouro
, EN.Numero
, EN.Complemento
, EN.CEP
, EN.Lat
, EN.Lng
from tbPessoa PES
INNER JOIN tbAdvogado ADV ON PES.idPessoa = ADV.idPessoa
INNER JOIN tbEndereco EN ON PES.idEmpresa = EN.idEmpresa
LEFT JOIN tbCidade CID ON CID.idCidade = EN.idCidade
where adv.Ativo = 1
and CONTAINS (en.*, '"rua*"')
OR EN.idCidade IN (SELECT idCidade
FROM tbCidade
WHERE CONTAINS (*, '"rua*"'))
OR PES.idPessoa IN (SELECT DISTINCT (ADVC.idPessoa)
FROM tbComarca C
INNER JOIN tbAdvogadoComarca ADVC
ON ADVC.idComarca = C.idComarca
WHERE CONTAINS (Nome, '"rua*"'))
OR PES.idPessoa IN (SELECT OAB.idPessoa
FROM tbAdvogadoOAB OAB
WHERE CONTAINS (NROAB, '"rua*"'))
我尝试了FREETEXT和CONTAINS。使用像WHERE CONTAINS (NROAB, 'rua'))
这样简单的东西,但它也给我带来了包含“Rua”的寄存器。
我认为我的查询可能有一些问题,然后我尝试了一个更简单的查询,它也给我带来了停顿词“Rua”。
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, 'rua')
我注意到的一件事是,系统停止列表中的原生单词工作得很好。例如,如果我尝试单词“do”(意思是“of”),它就不会给我带来任何寄存器。
示例:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"do*"')
我尝试在所有表格中通过SSMS运行命令“Start full population”来检查这是否是问题并且什么都没有。
我在这里缺少什么。这是我第一次使用全文索引,我可能会错过一些设置它。
提前感谢您的支持。
此致
塞萨尔。
答案 0 :(得分:1)
你已经改变了你的问题,所以我会改变我的答案并尝试更好地解释它。
禁用词可以是具有特定语言或含义的词 可以是没有语言意义的令牌。例如,在 英语,“a”,“and”,“is”和“the”等词 从全文索引中删除,因为它们已知无用 搜索。
虽然它忽略了包含停用词,全文索引 确实考虑到了他们的立场。例如,考虑一下 短语,“说明适用于这些冒险作品周期 模型“。下表描述了单词中的单词位置 短语:
我不知道为什么,但我认为它只适用于使用短语搜索:
如果您有这样的一行:
Teste anything casa
您将全文查询为:
SELECT *
FROM Address
WHERE CONTAINS (*, '"teste rua casa"')
该行:
Teste anything casa
将被退回。在这种情况下,fulltext将您的查询翻译为:
"Search for 'teste' near any word near 'casa'"
使用“或”运算符查询全文或仅搜索一个单词时,规则不适用。我已经测试了好几次大约3个月,我从来不明白为什么。
修改强>
如果你有一行
"Rua José do Patrocinio nº125"
并查询全文
"WHERE CONTAINS (, '"RUA" or "Jose*" or "do*"')"
它将带来该行,因为它包含至少一个您要搜索的单词,而不是因为单词“rua”和“do”被忽略。