Sql server 2008 SQL Server 2008-全文搜索未在停止词上停止

Sql server 2008 SQL Server 2008-全文搜索未在停止词上停止,sql-server-2008,full-text-search,stop-words,Sql Server 2008,Full Text Search,Stop Words,我根据系统的列表创建了一个停止列表,并设置了全文索引来使用它 如果我运行代码select unique_index_id,stoplist_id from sys.fulltext_index,我可以看到我的所有索引都在使用我创建的id为5的stoplist 当我使用FTS_部分运行文本时,结果是正确的。 例如: SELECT special_term, display_term FROM sys.dm_fts_parser (' "Rua José do Patrocinio nº125, V

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

如果我运行代码
select unique_index_id,stoplist_id from sys.fulltext_index
,我可以看到我的所有索引都在使用我创建的id为5的stoplist

当我使用FTS_部分运行文本时,结果是正确的。 例如:

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)
我添加到停止列表中的单词显示为噪声单词。但出于某种原因,当我运行查询时,它也会给我带来包含stopwords的寄存器

例如:

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”的寄存器

我的搜索是地址搜索,所以应该忽略诸如“Street”、“Avenue”等词。。(当然是葡萄牙语,我也把它们都加了进去)

这是我用来查找表的查询

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”

我注意到的一件事是,来自系统停止列表的本地单词工作正常。例如,如果我尝试单词“do”(意思是“of”),它不会给我带来任何寄存器

例如:

SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"do*"')
我试图通过所有表中的SSM运行命令“开始完全填充”,以检查这是否是问题所在,但没有得到任何结果

我错过了什么。这是我第一次使用全文索引,我可能在设置全文索引时遗漏了一些要点

提前感谢您的支持

问候,


塞萨尔。

你已经改变了你的问题,因此我将改变我的答案,并尝试更好地解释它

根据:

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

虽然它忽略了stopwords的包含,但全文索引 考虑到他们的立场。例如,考虑 短语,“说明适用于这些冒险工程周期 模型”。下表描述了单词在列表中的位置 短语:

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

如果您有这样一行:

Teste anything casa
"Search for 'teste' near any word near 'casa'"
您可以通过以下方式查询全文:

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

Teste anything 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”被忽略。

您已经更改了您的问题,因此我将更改我的答案,并尝试更好地解释它

根据:

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

虽然它忽略了stopwords的包含,但全文索引 考虑到他们的立场。例如,考虑 短语,“说明适用于这些冒险工程周期 模型”。下表描述了单词在列表中的位置 短语:

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

如果您有这样一行:

Teste anything casa
"Search for 'teste' near any word near 'casa'"
您可以通过以下方式查询全文:

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

Teste anything 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”。

我认为stopwords会忽略搜索中的一个单词。例如,我希望stopwords是这样工作的。如果我搜索“Rua Josédo Patrocinio nº125”,使用“WHERE CONTAINS(,”“Rua”或“Jose*”或“do*”)”这是我在C#中装入查询的方式,它将为我带来上面的寄存器,因为“Rua”和“do”这两个词可能会被忽略,但搜索将匹配“Jose”。但如果我搜索“WHERE CONTAINS(,”“RUA”或“do*”)”。它不会给我带来任何东西,因为我正在寻找的词语被忽略了。我只是不明白它到底是怎么工作的吗?这就是我认为它应该做的。但事实并非如此。我们在这方面花了很多时间,我们决定创建一个算法,在创建搜索查询时忽略stopwords。让我感兴趣的是,它的行为方式与系统提供的stopwords的行为方式相同。只有那些