PostgreSQL: Полнотекстовый поиск - Как искать частичные слова?

После вопроса, отправленного здесь о том, как я могу увеличить скорость на одном из моих Методов поиска SQL, мне рекомендовали обновить мою таблицу для использования Полнотекстового поиска. Это - то, что я теперь сделал, с помощью индексов Сути для создания поиска быстрее. На некоторых "простых" запросах я заметил заметный рост, которым я очень доволен.

Однако я испытываю затруднения в поиске частичных слов. Например, у меня есть несколько записей, которые содержат Сквайра слова (454), и у меня есть несколько записей, которые содержат Белку (173). Теперь, если я ищу Сквайра, это только возвращает 454 записи, но я также хочу, чтобы это возвратило записи Белки также.

Мой запрос похож на это

SELECT title 
FROM movies 
WHERE vectors @@ to_tsoquery('squire');

Я думал, что мог сделать to_tsquery('squire%') но это не работает.
Как я заставляю это искать частичные соответствия?

Кроме того, в моей базе данных у меня есть записи, которые являются фильмами и другими, которые являются просто сериалами. Они дифференцируются "" по имени, таким образом, как "Munsters" сериал, тогда как Munsters является фильмом шоу. То, что я хочу смочь сделать, искать просто сериал И просто фильмы. Какая-либо идея о том, как я могу достигнуть этого?

Отношения Anthoni

17
задан a_horse_with_no_name 6 April 2012 в 18:14
поделиться

3 ответа

Даже используя LIKE , вы не сможете получить «белку» от оруженосца% , потому что «белка» имеет две буквы "r". Чтобы получить Сквайра и Белку, вы можете выполнить следующий запрос:

SELECT title FROM movies WHERE vectors @@ to_tsquery('squire|squirrel');

Чтобы различать фильмы и телешоу, вы должны добавить столбец в вашу базу данных. Однако есть много способов снять шкуру с этой кошки. Вы можете использовать подзапрос, чтобы заставить postgres сначала найти фильмы, соответствующие 'squire' и 'squirrel', а затем выполнить поиск в этом подмножестве, чтобы найти заголовки, начинающиеся с '"'. Можно создать индексы для использования в LIKE '"% ...' поиск.

Не исследуя другие возможности индексирования, вы также можете запустить их - поиграйте с ними, чтобы найти самый быстрый:

SELECT title 
FROM (
   SELECT * 
   FROM movies 
   WHERE vectors @@ to_tsquery('squire|squirrel')
) t
WHERE title ILIKE '"%';

или

SELECT title 
FROM movies 
WHERE vectors @@ to_tsquery('squire|squirrel') 
  AND title ILIKE '"%';
5
ответ дан 30 November 2019 в 09:57
поделиться

Одна вещь, которая может сработать, - это разбить слово, которое вы ищете, на более мелкие части. Так что вы можете искать вещи, у которых есть squi, quir, squire и т. Д. Я не уверен, насколько это будет эффективно, но это может помочь.

При поиске фильма или фильма вы можете попробовать поместить текст в одинарные кавычки. так что это будет либо «шоу», либо «шоу». Думаю, это тоже может сработать.

0
ответ дан 30 November 2019 в 09:57
поделиться

Попробуйте,

SELECT title FROM movies WHERE to_tsvector(title) @@ to_tsquery('squire:*')

Это работает на PostgreSQL 8.4+

52
ответ дан 30 November 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: