Postgresql Postgres从Select中的列表中查找并返回关键字

Postgresql Postgres从Select中的列表中查找并返回关键字,postgresql,search,full-text-search,keyword-search,array-agg,Postgresql,Search,Full Text Search,Keyword Search,Array Agg,我有一个简单的postgres表,其中包含一个comments(text)列。 在一个视图中,我需要在comments字段中搜索一个单词列表,然后返回一个逗号分隔的单词列表,作为一列(以及一组普通列)找到 定义的关键字列表包含大约20个单词。例如苹果、香蕉、梨、桃、李子 理想的结果是: id | comments | keywords ----------------------------------------------------- 1 | I l

我有一个简单的postgres表,其中包含一个comments(text)列。 在一个视图中,我需要在comments字段中搜索一个单词列表,然后返回一个逗号分隔的单词列表,作为一列(以及一组普通列)找到

定义的关键字列表包含大约20个单词。例如苹果、香蕉、梨、桃、李子

理想的结果是:

id | comments                    | keywords
-----------------------------------------------------
1  | I like bananas!             | bananas
2  | I like apples.              | apples
3  | I don't like fruit          | 
4  | I like apples and bananas!  | apples,bananas
我想我需要做一个子查询和数组_agg?或者可能是“在哪里”。但我不知道怎么把它栓在一起

非常感谢,,
Steve

您可以使用全文搜索功能获得结果:

  • 用你的单词列表设置新单词
  • 创建将基于您的词典的文档。不要忘记从配置中删除所有其他字典,因为在您的情况下,所有其他单词实际上都是stopWord
  • 之后,当你执行

    select plainto_tsquery('<your config name>', 'I like apples and bananas!')
    
    你会得到

    'like' & 'appl' & 'banana'
    
    这并不完全适合您的情况。

    另一种更简单的方法(但速度较慢):

    创建dict表:

    create table keywords (nm text);
    
    insert into keywords (nm)
    values ('apples'), ('bananas');
    
    对文本执行以下脚本以提取关键字

    select string_agg(regexp_replace(foo, '[^a-zA-Z\-]*', '', 'ig'), ',') s
      from regexp_split_to_table('I like apples and bananas!', E'\\s+') foo 
     where regexp_replace(foo, '[^a-zA-Z\-]*', '', 'ig') in (select nm from keywords)
    

    这个解决方案在语义上更糟糕,所以香蕉和香蕉将是不同的关键字。

    你怎么知道关键字是什么和不是什么?你说的“没有名字的马”是什么意思?我已经定义了要查找的关键字列表——我想大概有20个。谢谢@TnT——这非常有用。我在这方面取得了很好的进展,但我得到了我的话和其他东西,如数字和未知短语(如100,晚上10点等)。有没有办法忽略除我的单词列表之外的所有内容?到目前为止,我的配置是:创建文本搜索配置public.nrw(COPY=pg_catalog.english);创建文本搜索词典nrw_dict_ispell(TEMPLATE=ispell,DictFile=nrw_dict,AffFile=nrw_dict);更改电子邮件、url、url\u路径、sfloat、float、int的文本搜索配置nrw DROP映射;使用nrw_dict_ispell对asciiword、asciiword、hword_asciipart、word、hword、hword_部件进行ALTER文本搜索配置nrw ALTER映射;通过做正则表达式替换来解决数字的问题。一旦数字被删除,关键字就被完美地返回了!
    select string_agg(regexp_replace(foo, '[^a-zA-Z\-]*', '', 'ig'), ',') s
      from regexp_split_to_table('I like apples and bananas!', E'\\s+') foo 
     where regexp_replace(foo, '[^a-zA-Z\-]*', '', 'ig') in (select nm from keywords)