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不可用