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%')
': *' - указать соответствие префикса.