После вопроса, отправленного здесь о том, как я могу увеличить скорость на одном из моих Методов поиска SQL, мне рекомендовали обновить мою таблицу для использования Полнотекстового поиска. Это - то, что я теперь сделал, с помощью индексов Сути для создания поиска быстрее. На некоторых "простых" запросах я заметил заметный рост, которым я очень доволен.
Однако я испытываю затруднения в поиске частичных слов. Например, у меня есть несколько записей, которые содержат Сквайра слова (454), и у меня есть несколько записей, которые содержат Белку (173). Теперь, если я ищу Сквайра, это только возвращает 454 записи, но я также хочу, чтобы это возвратило записи Белки также.
Мой запрос похож на это
SELECT title
FROM movies
WHERE vectors @@ to_tsoquery('squire');
Я думал, что мог сделать to_tsquery('squire%')
но это не работает.
Как я заставляю это искать частичные соответствия?
Кроме того, в моей базе данных у меня есть записи, которые являются фильмами и другими, которые являются просто сериалами. Они дифференцируются "" по имени, таким образом, как "Munsters" сериал, тогда как Munsters является фильмом шоу. То, что я хочу смочь сделать, искать просто сериал И просто фильмы. Какая-либо идея о том, как я могу достигнуть этого?
Отношения Anthoni
Даже используя 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 '"%';
Одна вещь, которая может сработать, - это разбить слово, которое вы ищете, на более мелкие части. Так что вы можете искать вещи, у которых есть squi, quir, squire и т. Д. Я не уверен, насколько это будет эффективно, но это может помочь.
При поиске фильма или фильма вы можете попробовать поместить текст в одинарные кавычки. так что это будет либо «шоу», либо «шоу». Думаю, это тоже может сработать.
Попробуйте,
SELECT title FROM movies WHERE to_tsvector(title) @@ to_tsquery('squire:*')
Это работает на PostgreSQL 8.4+