SQL Server 2008 - 全文搜索不会停止停用词

时间:2013-03-04 21:12:35

标签: sql-server-2008 full-text-search stop-words

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

如果我运行代码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”来检查这是否是问题并且什么都没有。

我在这里缺少什么。这是我第一次使用全文索引,我可能会错过一些设置它。

提前感谢您的支持。

此致

塞萨尔。

1 个答案:

答案 0 :(得分:1)

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

根据Stopwords and Stoplists

  

禁用词可以是具有特定语言或含义的词   可以是没有语言意义的令牌。例如,在   英语,“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”被忽略。