2016-04-14 4 views
0

Я использую Postgres, чтобы соответствовать шаблону в столбце строк, без полнотекстовой поисковой системы (потому что я не хочу прерывания, стоп-слова, рейтинг и т. Д.).Общий шаблон в Postgres?

Как получить общее количество шаблонов, которые соответствуют (даже если более одного поля содержит шаблон несколько раз). Это возможно?

Например: поиск собаки в

text 
---- 

The dog looked at the other dog. 
The dog looked at the cat. 

Результат при поиске собаки: 3 удара.

ответ

0
SELECT 
SUM(
    (LENGTH(text) - LENGTH(REGEXP_REPLACE(text,'dog','','g')))/LENGTH('dog') 
) as hits 
FROM 
the_table 

Fiddle: http://sqlfiddle.com/#!15/600f5/1

+0

Приятный, я видел этот фрагмент в Интернете раньше, теперь я помню. Это достаточно быстро на столе с 1 м строк? И означает ли это, что я запускаю два запроса: один для подсчета и один для извлечения? – Private

0

Вы можете сделать это с полнотекстовым поиском без использования морфологии и игнорируемых слов. Вы можете использовать «простой» словарь. Подробнее о словарях в documentation.

Вот пример для таблицы "ТСТ":

CREATE TABLE tst (t text); 
INSERT INTO tst VALUES ('The dog looked at the other dog.'); 
INSERT INTO tst VALUES ('The dog looked at the cat.'); 

Пример запроса, который использует функцию ts_stat():

postgres=# SELECT SUM(nentry) FROM ts_stat('SELECT to_tsvector(t) FROM tst') WHERE word = 'dog'; 
sum 
----- 
    3 
(1 row) 

Я не знаю, о выполнении ts_stat(). Вы можете протестировать его с помощью индексов.

0

regexp_matches возвращает одну строку для каждого совпадения, если вызывается с параметром g. Вы можете использовать это, чтобы подсчитать количество найденных совпадений, если у вас есть столбец первичного ключа в таблице.

select id, count(*) 
from the_table, regexp_matches(the_column, 'dog', 'g') 
where the_column ~ 'dog' 
group by id 

Условие where the_column ~ 'dog' уменьшает число строк, которые должны быть обработаны и, следовательно, количество строк, которые должны быть группой. Если у вас есть только несколько строк, содержащих термин поиска, это должно повысить производительность.

Смежные вопросы