5

我正在開發巴西葡萄牙語的簡單文章網站。搜索功能基於全文搜索,但不會返回預期結果。無法從postgre全文檢索中獲得正確的結果

我在postgresql上做了這個。下面是簡化表:

Artigos 
-id 
-title -- article title 
-intro -- article introduction 
-content -- article body 
-publishdate -- date of launch 
-artigosts -- this will work as our fts index. 

創建表後,我跑:

UPDATE artigos SET artigosts = 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(title,'')), 'A') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(intro,'')), 'B') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(content,'')), 'C'); 

CREATE INDEX artigosts_idx ON artigos USING gist (artigosts); 

CREATE TRIGGER artigosts_tg 
BEFORE INSERT OR UPDATE ON artigos 
FOR EACH ROW EXECUTE PROCEDURE 
    tsvector_update_trigger('artigosts', 'pg_catalog.portuguese', 'title', 'intro', 'content'); 

是的,我打算在搜索中使用簡單weightning。做了一個索引加速,一個觸發器,所以我可以插入和更新,而不用擔心重新制作索引等等。

那麼,根據我的理解,這一切都很好。但結果不是。一個簡單的例子。

比方說,我有「... banco de dados ...沒有banco ...」作爲一個文章內容。當我這樣做時:

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts; 

它返回一個空集。我檢查了ts_vector列,看到謂詞'banc'和'dad'。但我仍然不明白爲什麼它不返回包含提到的文章的行。

有人可以提出這個問題的燈光?

+0

正在玩服務器上可用的不同配置。我認爲這是可用的字典和單詞停止的問題。有誰知道如何將上面的字符(如áéóôú)映射到矢量? – Dave 2010-10-14 18:46:23

回答

4

原因可能是您的默認詞典設置爲英文。嘗試以下查詢以確定實際情況是否如此。

SELECT * FROM ts_debug('banco de dados'); 

此查詢將顯示詞典如何分析您的搜索短語。它應該提供詞彙「banco」,「de」和「dado」。因此,您實際上搜索的內容不會存在於索引中,您將收到0個結果。

現在試試這個:

SELECT * FROM ts_debug('portuguese', 'banco de dados'); 

應該返回存在於索引中,「淺灘」和「爸爸」的語意。如果是這種情況,那麼你可以簡單地改變你的搜索查詢來獲得合適的結果。

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('portuguese', 'banco de dados') @@ artigosts; 
+0

Thx回覆。是的,我意識到主要字典是基於英語的。儘管存在,葡萄牙仍然認爲字典很吸引人。我可以使用SIMPLE配置實現最佳效果。主要的問題是使用特殊字符,如áéóíúçãõ,那些在葡萄牙語上使用很多。有些詞位沒有正確解析,但大多數詞位都是正確解析的,所以到目前爲止,它部分滿足了我的需求。 – Dave 2010-10-23 14:29:49

+0

@Dave - 我還沒有用過除英語之外的任何語言來嘗試這種方式,但是您可以隨時使用ispell字典,並將其放回snowballer。在線提供葡萄牙語字典:http://lasr.cs.ucla.edu/geoff/ispell-dictionaries.html#Portuguese-dicts – thetaiko 2010-10-23 14:58:51

+0

Thx用於快速回復,但我希望我可以更改我的主機上的這些設置。不幸的是,在特定的服務器上,更改字典屬性,回退,文件等不是我的選擇。但是,thx的提示。 – Dave 2010-10-23 15:17:52

1

這可能會遲到你。 我沒有足夠的聲望來添加一個簡單的評論...

關於特殊字符我變得tsvector之前他們unaccent。

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ')) 

所以我得到:

"'aeoiucao':4 'banco':1 'dados':3 'de':2" 

您需要:

CREATE EXTENSION unaccent; 

...用戶postgres。 當然,你還必須使你的tsquery不可用