pg_search全文搜索(tsearch)可以同时进行前缀和字典搜索吗?

问题描述 投票:0回答:1

我一直在摆弄 pg_search。使用 tsearch,我成功地设置了字典搜索和前缀搜索。但是,如果我按字典术语搜索,它也不会产生前缀搜索的结果。我想知道是否有办法让它们同时工作。

例如,我的字典中的一行看起来像这样:

小麦谷物食品面包

如果我搜索“面包”,所有标题为“小麦”“谷物”“食物”或“面包”的内容都会出现。

但是如果我有一个标题为“breadman”的项目,它应该在搜索“bread”时出现,因为前缀搜索是正确的。但除非我删除字典或输入部分单词,如“brea”或“breadma”,否则不会。

参考代码:

  pg_search_scope :search_title, lambda { |query, params| 
    {
      query: query,
      against: :title,
      using: {
        tsearch: {
            dictionary: 'english', prefix: true
        }
      }
    }

如上所述,我尝试过让字典和前缀同时工作。但是,如果搜索字典项,则前缀似乎不起作用。

ruby-on-rails postgresql full-text-search pg-search
1个回答
1
投票

我不知道pg_search在做什么,但你可以使用同义词词典。

  • 在 PostgreSQL“共享”目录的

    mysyn.syn
    子目录中创建一个文件
    tsearch_data
    ,其中包含

    wheat bread
    grain bread
    food bread
    
  • 创建同义词词典:

    CREATE TEXT SEARCH DICTIONARY mysyn (
       TEMPLATE = synonym,
       SYNONYMS = mysyn
    );
    
  • 创建文本搜索配置:

    CREATE TEXT SEARCH CONFIGURATION mycf (COPY = english);
    ALTER TEXT SEARCH CONFIGURATION mycf
       ALTER MAPPING FOR asciiword WITH mysyn, english_stem;
    

这应该可以按照前缀搜索的要求工作:

SELECT to_tsvector('mycf', 'food') @@ to_tsquery('mycf', 'bread:*');

 ?column? 
══════════
 t
(1 row)

SELECT to_tsvector('mycf', 'breadbox') @@ to_tsquery('mycf', 'bread:*');

 ?column? 
══════════
 t
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.