2013-03-04 52 views
1

我已經根據系統列表創建了一個停止列表,並且設置了我的全文索引來使用它。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。

+0

謝謝@Rafael Colucci的回答。我在閱讀您的答案後編輯了我的問題,因爲我可以明白爲什麼您認爲我希望將停用詞從結果寄存器中刪除。因爲我真的寫過。 =)謝謝。 – 2013-03-05 12:29:40

回答

1

你改變了你的問題,所以我會改變我的答案,並嘗試解釋它好一點。

根據Stopwords and 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」這個詞被忽略。

+0

嗯,我認爲停用詞會忽略搜索中的單詞。 例如 我期望停用詞以這種方式工作。 如果我使用子句: 「Where CONTAINS(*,'」RUA *「或」Jose *「或」do *「')」搜索「RuaJosédo Patrocinionº125」,這是我將查詢裝入C#,它會給我上面的註冊表,因爲2個單詞「rua」和「do」可能會被忽略,但是搜索會匹配「Jose」。 但是,如果我搜索「在哪裏包含(*,'」RUA *「或」do *「')」。它不會給我帶來什麼,因爲我正在搜索的詞語被忽略了。 我只是沒有得到它是如何工作的? – 2013-03-05 12:11:04

+0

這是我認爲應該做的。但它沒有發生。我們花費了大量的時間,我們決定創建一個算法,在創建搜索查詢時忽略停用詞。 – 2013-03-05 13:01:20

+0

令我感興趣的是它的行爲方式應該是系統給出的停用詞。只有我添加的那些不能正常工作。 :S – 2013-03-05 13:20:18

相關問題