【问题标题】:Cannot get right results from postgre full-text search无法从 postgre 全文搜索中获得正确的结果
【发布时间】:2011-04-25 13:21:47
【问题描述】:

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

我在 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');

是的,我打算对搜索使用简单的加权。做了一个索引来加速,一个触发器,所以我可以插入和更新,而不用担心重新制作索引等等。

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

假设我有 "... banco de dados ... no banco ..." 作为一篇文章内容。当我这样做时:

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

它返回一个空集。我检查了 ts_vector 列并看到了谓词“banc”和“dad”。但我仍然不明白为什么它不返回包含所提到文章的行。

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

【问题讨论】:

  • 正在使用服务器上可用的不同配置。我认为这是可用字典和单词停止的问题。有谁知道如何将上层字符(如 áéóôú)映射到向量?

标签: postgresql internationalization full-text-search full-text-indexing


【解决方案1】:

对你来说可能为时已晚。 而且我没有足够的声誉来添加简单的评论...

关于特殊字符,我在转换为 tsvector 之前不重音。

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

所以我得到:

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

你需要:

CREATE EXTENSION unaccent;

... 作为用户 postgres。 当然,您还必须取消 tsquery 的重音

【讨论】:

    【解决方案2】:

    这可能是因为您的默认字典设置为英文。尝试以下查询以确定是否确实如此。

    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;
    

    【讨论】:

    • 感谢您的回复。是的,我意识到主要的词典是基于英语的。尽管存在葡萄牙语词典,但很糟糕。我可以使用 SIMPLE config 获得最佳结果。主要问题是特殊字符的使用,例如 áéóíúçãõ,这些在葡萄牙语中被大量使用。并且有些词位解析不正确,但大多数词位解析正确,所以到目前为止它部分满足了我的需求。
    • @Dave - 我没有用英语以外的任何语言尝试过这个,但你总是可以使用 ispell 字典作为滚雪球的后备。葡萄牙语词典可在线获取:lasr.cs.ucla.edu/geoff/…
    • 感谢您的快速回复,但我希望我可以更改主机上的这些设置。不幸的是,在该特定服务器上更改 dict 属性、回退、文件等不是我的选择。但是,再次感谢您的提示。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2019-10-15
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多