我已經根據系統列表創建了一個停止列表,並且設置了我的全文索引來使用它。SQL Server 2008 - 全文搜索不會停在停用詞
如果我運行代碼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*"')
引出了上面我所期望的寄存器。既然'魯阿'這個詞應該被忽略,但'何塞'會是一場比賽。
但是如果我搜索:
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')
我注意到的一件事是,從系統stoplist本地工作的單詞工作得很好。例如,如果我嘗試使用「do」(意思是「of」)這個詞,它不會給我任何寄存器。
例子:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"do*"')
我試圖運行命令「啓動完全填充」通過SSMS中的所有表來檢查是否是問題,什麼也沒得到。
我在這裏錯過了什麼。這是我第一次使用Fulltext索引,並且可能會錯過設置它的一些要點。
非常感謝您的支持。
Regards,
Cesar。
謝謝@Rafael Colucci的回答。我在閱讀您的答案後編輯了我的問題,因爲我可以明白爲什麼您認爲我希望將停用詞從結果寄存器中刪除。因爲我真的寫過。 =)謝謝。 – 2013-03-05 12:29:40