Postgresql полнотекстовый поиск часть слов - PullRequest
14 голосов
/ 27 декабря 2010

Может ли 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 ;

Ответы [ 4 ]

20 голосов
/ 28 декабря 2010

Вы можете использовать сопоставление префикса 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)

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

10 голосов
/ 29 декабря 2010

Звучит так, будто вы просто хотите подстановочный знак.

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

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

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

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

2 голосов
/ 03 мая 2012

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

': *' - для указания соответствия префикса.

2 голосов
/ 27 декабря 2010

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

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

По сути, модуль pg_tgrm разбивает слово на все части, чтобы можно было искать эти отдельные части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...