【问题标题】:Postgres full-text search with synonymsPostgres 带同义词的全文搜索
【发布时间】:2012-08-07 19:47:34
【问题描述】:

我有一个餐厅数据库,我对其进行全文搜索。代码如下所示:

SELECT * FROM restaurant WHERE restaurant.search_vector @@ plainto_tsquery(:terms);

search_vector 是这样定义的:

alter table restaurant add column search_vector tsvector;
create index restaurant_search_index on restaurant using gin(search_vector);
create trigger restaurant_search_update before update or insert on restaurant
    for each row execute procedure
    tsvector_update_trigger('search_vector',
    'pg_catalog.english','title');

现在,这个搜索的一个显着问题是烧烤这个词。它可以拼写许多不同的方式:烧烤、烧烤、BBQ、B.B.Q.、B-B-Q 等。当有人搜索其中任何一个时,我需要在餐厅中搜索所有这些术语。

根据我在网上阅读的内容,我似乎需要修改字典(应该是pg_catalog.english,对吗?),但我不知道该怎么做。

【问题讨论】:

    标签: postgresql full-text-search


    【解决方案1】:

    听起来你想做的是在你的英文字典前面添加一个同义词字典。但这仅适用于单个单词,因此您可能会遇到 B.B.Q 问题。如果它被解析为三个单独的标记。

    Synonym dictionaries in postgresql.org docs

    【讨论】:

    • 奇怪的是,根据我的经验,最能解决这个问题的字典类型是“词库”。
    • 我已经启动并运行了同义词词典。它适用于烧烤和烧烤,但它解释了 B.B.Q.作为“文件”而不是“asciiword”,所以我的同义词词典无效。有什么建议吗?
    • 你能为 B.B.Q 做一个查询重写吗?去烧烤?
    【解决方案2】:

    当我遇到类似问题时,我遇到了查询重写选项,例如,参见 http://www.postgresql.org/docs/8.3/static/textsearch-features.html,第 12.4.2.1 节

    这是一种比处理字典更简单的方法,因为它允许通过在重写表中插入新规则来立即扩展重写规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2020-05-26
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多