Postgres 从 Select 列表中查找和 Return 个关键字

Postgres Find and Return Keywords From List Within Select

我有一个简单的 postgres table,其中包含一个评论(文本)列。 在一个视图中,我需要在评论字段中搜索单词列表,然后 return 以逗号分隔的单词列表作为一列(以及一堆普通列)。

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

理想的结果应该是这样的:

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

我想我需要做一个子查询 array_agg?或者可能 'where in'。但我不知道如何将它们组合在一起。

非常感谢, 史蒂夫

您可以使用全文搜索工具来获得结果:

  1. 使用您的单词列表设置新的 ispell dictionary
  2. 创建 full-text search configuration,它将基于您的字典。不要忘记从配置中删除所有其他词典,因为在您的情况下,所有其他词实际上都是停用词。

之后当你执行

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

你只会得到你的关键字:'apples' & 'bananas' 甚至 'apple' & 'banana' 如果你正确设置字典。

默认情况下,英语配置使用减少单词结尾的滚雪球词典,因此如果您运行

select plainto_tsquery('english', 'I like apples and bananas!')

你会得到

'like' & 'appl' & 'banana'

这不完全适合你的情况。

另一个更简单的方法(但更慢):

创建字典table:

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)

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