Допустим, у вас есть таблица movies
со следующими полями VARCHAR
или TEXT
:
Я хочу написать запрос в postgresql, чтобы сопоставить текст в любом из этих трех полей.Но в идеале я хочу сделать этот поиск очень размытым способом.Например:
- Я бы хотел, чтобы
Tron
совпадал с Tron
title - Я бы хотел, чтобы
tron
совпадал с tron
title - Я хотел бы, чтобы
The Tron
соответствовал Tron
заголовку - Я хотел бы
Steven Lisberger
соответствовал Lisberger, Steven
автору - Я хотел бы
commuter haker
, чтобы соответствовать описанию, содержащему computer hacker
. - Я бы набрал
Tron Sci-Fi
, чтобы сопоставить заголовок Tron
с описанием Sci-Fi movie
.
Так что, по сути, я рассчитываю нахотя бы некоторые из следующих функций:
- Без учета регистра
- Возможность игнорировать определенные слова
- Игнорировать порядок слов
- Использовать некоторый алгоритм расстояния между словами,например, Левенштейн
- Объединяйте несколько полей при поиске
Я знаю, что это похоже на полнотекстовый поиск postgresql с использованием некоторой интеграции ispell вместо Левенштейнаалгоритм.Но он использует семантический вектор, зависящий от локали текста, что в каком-то смысле является антифункцией в моем случае.Мои записи фильмов могут быть написаны на любом языке, и у меня нет возможности различать их.Кроме того, у меня нет доступа к конфигурации сервера postgresql для добавления недостающих словарей.
Итак, я думаю, что я хотел бы иметь что-то вроде полнотекстового поиска, но вместо этого использовать какой-товектор-бабочка, составленный из различных рангов Левенштейна шаблонных слов с любым словом в тексте, чтобы соответствовать.
Я знаю, что это было бы супер неэффективно и по этой причине, конечно, его не существует.Но я хотел бы получить некоторую информацию, чтобы подумать о какой-то альтернативе или лучшем подходе.
Кроме того, я не хочу использовать Elasticsearch для этого.Я могу скомпрометировать функции, чтобы упростить стек приложений.Тем не менее, мне действительно интересно, просто из любопытства, узнать, возможно ли с ним что-то сделать (никогда не использовал его раньше).