1

我已经根据系统列表创建了一个停止列表,并设置了全文索引以使用它。

如果我运行代码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 运行命令“开始完全填充”,以检查这是否是问题所在,但一无所获。

我在这里想念什么。这是我第一次使用全文索引,我可能会遗漏一些设置它的地方。

预先感谢您对我们的支持。

问候,

塞萨尔。

4

1 回答 1

1

你已经改变了你的问题,所以我会改变我的答案并尝试更好地解释它。

根据Stopwords 和 Stoplists

停用词可以是在特定语言中具有意义的词,也可以是没有语言意义的标记。例如,在英语语言中,诸如“a”、“and”、“is”和“the”之类的词被排除在全文索引之外,因为它们已知对搜索无用。

尽管它忽略了停用词的包含,但全文索引确实考虑了它们的位置。例如,考虑短语“说明适用于这些 Adventure Works Cycles 模型”。下表描述了词在短语中的位置:

我不知道为什么,但我认为它只适用于使用短语搜索,如:

如果你有这样的一行:

Teste anything casa

您将全文查询为:

SELECT *
FROM Address
WHERE CONTAINS (*, '"teste rua casa"')

该行:

Teste anything casa

将被退回。在这种情况下,全文会将您的查询翻译为如下内容:

"Search for 'teste' near any word near 'casa'"

当您使用“或”运算符查询全文或仅搜索一个词时,该规则不适用。我已经测试了几次大约 3 个月,但我不明白为什么。

编辑

如果你有电话线

"Rua José do Patrocinio nº125" 

你查询全文

"WHERE CONTAINS (, '"RUA" or "Jose*" or "do*"')" 

它会带来这条线,因为它确实包含您正在搜索的至少一个词,而不是因为“rua”和“do”这个词被忽略了。

于 2013-03-04T21:29:02.693 回答