0

У меня есть простая таблица postgres, которая содержит столбец комментариев (текст). В представлении мне нужно найти это поле комментариев для списка слов, а затем вернуть список разделенных запятыми слов, найденных в виде столбца (а также кучу нормальных столбцов).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? Или, возможно, «где в». Но я не могу понять, как это сделать.

Большое спасибо, Steve

+1

Откуда вы знаете, что такое ключевое слово, а что нет? –

+0

Что вы имеете в виду @a_horse_with_no_name? Я определил список ключевых слов для поиска - около 20 из них я думаю. –

ответ

0

Вы можете использовать полнотекстовый поиск средств для достижения результатов:

  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' 

, который не является точным подходит для вашего случая.

+1

Спасибо @TnT - это очень полезно. Я добился хороших результатов в этом вопросе, но я получаю ОБОИХ мои слова и другие вещи, такие как цифры и неизвестные фразы (т. Е. 100, 10 вечера и т. Д.). Есть ли способ игнорировать ВСЕ, кроме моего списка слов? –

+0

Мой конфигуратор до сих пор: CREATE TEXT SEARCH CONFIGURATION public.nrw (COPY = pg_catalog.английский); CREATE TEXT Поиск Пользователи nrw_dict_ispell ( ОБРАЗЕЦ = Ispell, DictFile = nrw_dict, AffFile = nrw_dict ); ALTER TEXT ПОИСК КОНФИГУРАЦИЯ nrw DROP MAPPING ДЛЯ email, url, url_path, sfloat, float, int; ALTER TEXT SEARCH CONFIGURATION nrw ALTER MAPPING Для asciiword, asciihword, hword_asciipart, word, hword, hword_part С nrw_dict_ispell; –

+0

Получил проблемы с номерами, выполнив regex_replace. После того, как цифры были разбросаны, ключевые слова были полностью возвращены! –

0

Другой простой способ (но медленнее):

создать 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) 

Это решение хуже с точки зрения семантики, поэтому бананы и бананы будут разными ключевыми словами.