Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 无法从postgre全文搜索中获得正确的结果_Postgresql_Internationalization_Full Text Search_Full Text Indexing - Fatal编程技术网

Postgresql 无法从postgre全文搜索中获得正确的结果

Postgresql 无法从postgre全文搜索中获得正确的结果,postgresql,internationalization,full-text-search,full-text-indexing,Postgresql,Internationalization,Full Text Search,Full Text Indexing,我正在用巴西葡萄牙语开发一个简单的文章网站。搜索功能基于全文搜索,但不会返回预期结果 这是我在postgresql上做的。以下是简化的表格: Artigos -id -title -- article title -intro -- article introduction -content -- article body -publishdate -- date of launch -artigosts -- this will work as our fts index. 创建表后,我运行

我正在用巴西葡萄牙语开发一个简单的文章网站。搜索功能基于全文搜索,但不会返回预期结果

这是我在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');
是的,我打算在搜索中使用简单的权重。做了一个索引来加速,一个触发器,这样我就可以插入和更新而不用担心重新创建索引等等

嗯,据我所知,一切都很好。但结果并非如此。一个简单的例子

假设我有“…护墙板银行…没有银行…”作为一篇文章内容。当我这样做时:

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts;
它返回一个空集。我检查了ts_vector列,看到了谓词“banc”和“dad”。但我仍然不明白为什么它不返回包含上述文章的行


有人能解释一下这个问题吗?

原因可能是您的默认词典设置为英语。请尝试以下查询以确定实际情况是否如此

SELECT * FROM ts_debug('banco de dados');
此查询将显示词典如何解析您的搜索短语。它应该提供词汇“banco”、“de”和“dado”。因此,您实际搜索的内容将不存在于索引中,您将收到0个结果

现在试试这个:

SELECT * FROM ts_debug('portuguese', 'banco de dados');
它应该返回索引中存在的词素,“banc”和“dad”。如果是这种情况,那么您可以简单地更改搜索查询以获得适当的结果

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

你可能要迟到了。 我没有足够的声誉来添加一个简单的评论

关于特殊字符,在转换为tsvector之前,我先取消输入它们

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ'))
所以我得到:

"'aeoiucao':4 'banco':1 'dados':3 'de':2"
您需要:

CREATE EXTENSION unaccent;
。。。作为用户postgres。
当然,您必须取消输入您的tsquery也

正在使用服务器上的不同配置。我认为这是现有词典和词库中的一个问题。有人知道如何将上面的字符(如á)映射到向量吗?谢谢回答。是的,我意识到主词典是以英语为基础的。而字典的葡萄牙语形式,尽管存在,也很糟糕。我可以使用简单的配置实现最佳效果。主要的问题是使用特殊字符,如在葡萄牙语中大量使用的óóíúçõ。有些词素解析不正确,但大多数词素解析正确,因此到目前为止,它部分满足了我的需要。@Dave-除了英语之外,我还没有尝试过其他语言,但你可以使用ispell字典,并在雪球游戏中使用。葡萄牙语词典在线提供:Thx用于快速回复,但我希望我能在主机上更改这些设置。不幸的是,在那个特定的服务器上,更改dict属性、回退、文件等不是我的选择。不过,还是谢谢你的提示。