0

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

定义的关键字列表包含大约 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

我想我需要做一个子查询和array_agg?或者可能是“在哪里”。但我不知道如何将它固定在一起。

非常感谢,史蒂夫

4

2 回答 2

0

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

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

之后当你执行

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'

这不完全适合您的情况。

于 2015-12-21T13:43:10.070 回答
0

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

创建字典表:

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)

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

于 2015-12-21T14:01:37.037 回答