Postgresql полнотекстовый поиск части слов

Может ли postresql выполнять полный текстовый поиск на основе слова "половина"? Например, я пытаюсь найти для "tree", но я говорю postgres для поиска "tr".

Я не могу найти такое решение, которое может это сделать.

В настоящее время я использую

 select * from test, to_tsquery('tree') as q where vectors @@ q ;

Но я хотел бы сделать что-то вроде этого:

 select * from test, to_tsquery('tr%') as q where vectors @@ q ;

Ответы

Ответ 1

Похоже, вы просто хотите подстановочные соответствия.

  • Один из вариантов, как упоминалось ранее, - триграммы. Мой (очень) ограниченный опыт работы с ним заключался в том, что он был слишком медленным на больших таблицах по моему вкусу (в некоторых случаях медленнее, чем LIKE). Как я уже сказал, мой опыт работы с триграммами ограничен, поэтому я, возможно, использовал его неправильно.

  • Второй вариант, который вы можете использовать, - это модуль wildspeed: http://www.sai.msu.su/~megera/wiki/wildspeed (вам нужно будет построить и установить этот tho).

Второй вариант будет работать и для суффикса/среднего соответствия. Что может быть или не быть больше, чем вы ищете.

Существует несколько предостережений (например, размер индекса), поэтому внимательно прочитайте эту страницу.

Ответ 2

Вы можете использовать сопоставление префикса tsearch, см. http://www.postgresql.org/docs/9.0/interactive/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

postgres=# select to_tsvector('tree') @@ to_tsquery('tr:*');
 ?column? 
----------
 t
(1 row)

Он будет работать только для поиска в префиксах, но не для частичного совпадения в любой позиции слова.

Ответ 3

Это можно сделать с помощью триграмм, но это не часть tsearch2.

Вы можете посмотреть руководство здесь: http://www.postgresql.org/docs/9.0/interactive/pgtrgm.html

В основном то, что делает модуль pg_tgrm, разбивает слово во всех его частях, чтобы он мог искать эти отдельные части.

Ответ 4

выберите * из test, to_tsquery ('tree') как q, где векторы @@q ИЛИ xxxx LIKE ('% tree%')

': *' - указать соответствие префикса.