2013-07-13 4 views
6

У меня есть база данных и вы хотите, чтобы иметь возможность искать в таблице поиск, который выглядит примерно так: выберите * из таблицы, где столбец типа "abc% def% ghi " или выберите * из таблицы, где столбец типа"% def% ghi " Есть ли способ индексировать столбец так, чтобы это было не слишком медленно?Есть ли способ индексирования в postgres для поиска быстрой подстроки

Редактировать: Могу ли я также уточнить, что база данных доступна только для чтения и не будет часто обновляться.

+0

Я думаю, что вам нужен полный текст [ index] (http://www.postgresql.org/docs/8.3/static/textsearch.html) –

+0

Этот вопрос лучше подходит для http://dba.stackexchange.com/ –

ответ

2

Для использования одного из операторов классов varchar_pattern_ops или text_pattern_ops

create index test_index on test_table (col varchar_pattern_ops); 

like оператора, который будет работать только если шаблон не начинается с % в этом случае требуется другая стратегия.

+2

Если требуется полнотекстовый поиск, [pg_trgm] (http://www.postgresql.org/docs/current/static/pgtrgm.html) может работать. Я использовал его в прошлом, и он работает очень хорошо при определенных условиях. Следует отметить, что индексы становятся довольно большими. IIRC, около 2,5x размер индексированного столбца. – bma

13

Варианта поиска текста и индексации включает в себя:

  • full-text indexing с словарем основой, включая поддержку приставку-поиск, например to_tsvector(mycol) @@ to_tsquery('search:*')

  • text_pattern_ops indexes для поддержки префикса строка соответствует, например, LIKE 'abc%' но не поисковые запросы, такие как %blah%;. A индекс reverse() d может использоваться для поиска суффиксов.

  • pg_tgrm trigram indexes о новых версиях as demonstrated in this recent dba.stackexchange.com post.

  • Внешний инструмент поиска и индексирования, такой как Apache Solr.

С минимальной приведенной выше информации, я бы сказал, что только индекс триграммы будет в состоянии помочь вам, так как вы делаете поиск инфиксного на строке и не ищете слова из словаря. К сожалению, индексы триграммы составляют огромный и довольно неэффективны; не ожидайте какого-то волшебного повышения производительности, и имейте в виду, что они берут на себя большую работу по созданию базы данных и ее обновлению.

1

Если вам нужно только, например, получить уникальные подстроки в целой таблице, вы можете создать индекс подстроки:

CREATE INDEX i_test_sbstr ON tablename (substring(columname, 5, 3)); 
-- start at position 5, go for 3 characters 

It is important that the substring() parameters in the index definition are 
the same as you use in your query. 

исх: http://www.postgresql.org/message-id/[email protected]

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