【发布时间】:2013-02-19 02:40:45
【问题描述】:
我根据系统列表创建了一个停止列表,并设置了全文索引以使用它。
如果我运行代码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”这个词(意思是“Street”)应该被忽略(因为我将它添加到停止列表中)。解析器将其识别为噪声,但是当我运行查询时,它会给我带来包含“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 运行命令“开始完全填充”,以检查是否是问题所在,但没有得到任何结果。
我在这里错过了什么。这是我第一次使用全文索引,我可能会遗漏一些设置。
提前感谢您的支持。
问候,
塞萨尔。
【问题讨论】:
-
感谢@Rafael Colucci 的回答。在阅读您的答案后,我编辑了我的问题,因为我明白您为什么认为我希望从结果寄存器中删除停用词。因为我真的写过。 =) 谢谢。
标签: sql-server-2008 full-text-search stop-words