текст перекладу
Уявіть, що ви намагаєтесь знайти той один смішний мем про "прокрастинацію" серед купи відео з котиками та кулінарних уроків. Замість того, щоб нескінченно гортати стрічку в соціальних мережах, чи не було б чудово, якби ви могли просто ввести "прокрастинація" і миттєво побачити всі меми, не відволікаючись на відео про приготування поганого авокадо тосту? Завдяки повнотекстовому пошуку в PostgreSQL ви можете зробити саме це — швидко знаходити те, що вам потрібно, без зайвого контенту.
Повнотекстовий пошук у PostgreSQL робить це можливим, і в цій статті ми проведемо вас через основи налаштування та використання FTS для ефективного та результативного пошуку даних. PostgreSQL підтримує потужні, ефективні та трохи магічні можливості FTS. Це як Google для вашої бази даних, але без реклами.
Давайте заглибимося в те, як працює FTS у PostgreSQL, як його налаштувати, а також — оскільки ми всі друзі — кілька жартів програмістів, щоб зробити процес цікавішим.
Що таке повнотекстовий пошук у PostgreSQL?
Повнотекстовий пошук дозволяє PostgreSQL здійснювати пошук і отримувати релевантні результати з текстових даних, збережених у базі даних. На відміну від базового пошуку за допомогою LIKE
, FTS оптимізований для природних мовних запитів, надаючи такі функції, як стемінг, токенізація та ранжування (не хвилюйтесь, я поясню ці терміни). Давайте розглянемо основні концепції, які роблять FTS таким потужним.
Ключові концепції
1. Документи
У PostgreSQL документ — це будь-який текст, який ви хочете шукати, наприклад:
- Блог-пости
- Опис товарів
- Коментарі користувачів
- Статті
Перерва на жарт:_
Скільки програмістів потрібно, щоб змінити лампочку? Жодного, це проблема апаратного забезпечення.
2. Токени та лексеми
Під час пошуку PostgreSQL розбиває текст на токени (слова або фрази) і перетворює їх на лексеми — нормалізовані базові форми слів. Наприклад:
"running"
→"run"
"jumps"
→"jump"
3. Стоп-слова
Загальні слова, такі як "the", "is" або "and", виключаються з індексації, щоб зекономити місце та підвищити релевантність пошуку. Ці слова називаються стоп-словами.
4. Стемінг
У стемінгу слова зводяться до їх кореневої форми, що дозволяє здійснювати пошук за будь-якими варіаціями цього слова. Наприклад:
- Пошук за
"run"
знайде"running"
,"ran"
або"runner"
.
5. tsvector та tsquery
tsvector
: Спеціальний тип даних, що зберігає попередньо оброблений текст для ефективного пошуку.tsquery
: Тип даних, що представляє оброблений пошуковий запит.
Перерва на жарт:
Чому розробники на Java носять окуляри?
Тому що вони не можуть побачити C#. (Ні, це не вимовляється як C хештег)
Основне, що потрібно зрозуміти в повнотекстовому пошуку, це tsvector
та tsquery
. Але визначення може бути не зовсім зрозумілим. Тому ось більш детальне пояснення.
Що таке tsvector?
Уявіть, що у вас є велика купа наліпок (ваш необроблений текст) з словами, написаними без порядку. tsvector — це як взяти ці наліпки, організувати слова в акуратний індекс і зробити список лише тих значущих термінів, позбавлених зайвих повторів і непотрібних слів (як "the", "is", "a").
Думайте про tsvector як про "пошуковий індекс" вашого тексту. Він попередньо обробляє та зберігає ваш контент таким чином, щоб він був оптимізований для пошуку.
текст перекладу
Уявіть, що ви намагаєтесь знайти той один смішний мем про "прокрастинацію" серед безлічі відео з котиками та кулінарних уроків. Замість того, щоб нескінченно прокручувати стрічку в соціальних мережах, чи не було б чудово, якби ви могли просто ввести "прокрастинація" і миттєво побачити всі меми, не відволікаючись на відео про приготування поганого авокадо тосту? Завдяки повнотекстовому пошуку в PostgreSQL ви можете зробити саме це — швидко знаходити те, що вам потрібно, без зайвого контенту.
Повнотекстовий пошук у PostgreSQL робить це можливим, і в цій статті ми проведемо вас через основи налаштування та використання FTS для ефективного та результативного пошуку даних. PostgreSQL підтримує потужні, ефективні та трохи магічні можливості FTS. Це як Google для вашої бази даних, але без реклами.
Давайте заглибимося в те, як працює FTS у PostgreSQL, як його налаштувати, а також — оскільки ми всі друзі — кілька жартів програмістів, щоб зробити процес цікавішим.
Що таке повнотекстовий пошук у PostgreSQL?
Повнотекстовий пошук дозволяє PostgreSQL здійснювати пошук і отримувати релевантні результати з текстових даних, збережених у базі даних. На відміну від базового пошуку за допомогою LIKE
, FTS оптимізований для природних мовних запитів, надаючи такі функції, як стемінг, токенізація та ранжування (не хвилюйтесь, я поясню ці терміни). Давайте розглянемо основні концепції, які роблять FTS таким потужним.
Ключові концепції
1. Документи
У PostgreSQL документ — це будь-який текст, який ви хочете шукати, наприклад:
- Блог-пости
- Опис товарів
- Коментарі користувачів
- Статті
Перерва на жарт:_
Скільки програмістів потрібно, щоб змінити лампочку? Жодного, це проблема апаратного забезпечення.
2. Токени та лексеми
Під час пошуку PostgreSQL розбиває текст на токени (слова або фрази) і перетворює їх на лексеми — нормалізовані базові форми слів. Наприклад:
"running"
→"run"
"jumps"
→"jump"
3. Стоп-слова
Загальні слова, такі як "the", "is" або "and", виключаються з індексації, щоб зекономити місце та підвищити релевантність пошуку. Ці слова називаються стоп-словами.
4. Стемінг
У стемінгу слова зводяться до їх кореневої форми, що дозволяє здійснювати пошук за будь-якими варіаціями цього слова. Наприклад:
- Пошук за
"run"
знайде"running"
,"ran"
або"runner"
.
5. tsvector та tsquery
tsvector
: Спеціальний тип даних, що зберігає попередньо оброблений текст для ефективного пошуку.tsquery
: Тип даних, що представляє оброблений пошуковий запит.
Перерва на жарт:
Чому розробники на Java носять окуляри?
Тому що вони не можуть побачити C#. (Ні, це не вимовляється як C хештег)
Основне, що потрібно зрозуміти в повнотекстовому пошуку, це tsvector
та tsquery
. Але визначення може бути не зовсім зрозумілим. Тому ось більш детальне пояснення.
Що таке tsvector?
Уявіть, що у вас є велика купа наліпок (ваш необроблений текст) з словами, написаними без порядку. tsvector — це як взяти ці наліпки, організувати слова в акуратний індекс і зробити список лише тих значущих термінів, позбавлених зайвих повторів і непотрібних слів (як "the", "is", "a").
Думайте про tsvector як про "пошуковий індекс" вашого тексту. Він попередньо обробляє та зберігає ваш контент таким чином, щоб він був оптимізований для пошуку.
текст перекладу
Створення індексу
Щоб прискорити пошук, PostgreSQL потрібно створити індекс на колонці search_vector
. Для повнотекстового пошуку зазвичай використовується індекс типу GIN
(Generalized Inverted Index):
CREATE INDEX idx_search ON articles USING GIN(search_vector);
GIN
: Це тип індексу, оптимізований для повнотекстового пошуку, який зберігає дані таким чином, щоб прискорити співпадіння текстових запитів.
Виконання пошуку
Тепер перейдемо до цікавої частини — пошуку! Використовуйте оператор @@
, щоб перевірити наявність співпадінь між tsvector
та tsquery
.
Знайдіть статті, що містять "PostgreSQL"
:
SELECT * FROM articles
WHERE search_vector @@ to_tsquery('english', 'PostgreSQL');
Перерва на жарт:
Два реляційні бази даних зайшли в бар NoSQL. Вони вийшли, бо не змогли знайти таблицю!
2. Поєднання ключових слів
- AND: Шукайте статті, що містять і
"PostgreSQL"
, і"database"
:
SELECT * FROM articles WHERE search_vector @@ to_tsquery('english', 'PostgreSQL & database');
- OR: Знайдіть статті, що згадують або
"PostgreSQL"
, або"MySQL"
:
SELECT * FROM articles WHERE search_vector @@ to_tsquery('english', 'PostgreSQL | MySQL');
3. Виключення слів
Знайдіть статті, які не містять "tutorial"
:
SELECT * FROM articles
WHERE NOT (search_vector @@ to_tsquery('english', 'tutorial'));
Перерва на жарт:
Чому база даних розлучилася з таблицею?
Вона знайшла відносини занадто обмежувальними.
4. Ранжування результатів
Використовуйте ts_rank
, щоб ранжувати результати за релевантністю:
SELECT id, title, content,
ts_rank(search_vector, to_tsquery('english', 'PostgreSQL')) AS rank
FROM articles
WHERE search_vector @@ to_tsquery('english', 'PostgreSQL')
ORDER BY rank DESC;
Складні сценарії
1. Багатомовний пошук
Для різних мов просто налаштуйте конфігурацію в to_tsvector
. Наприклад:
'french'
для французької'german'
для німецької
2. Оновлення в реальному часі
Використовуйте тригери для автоматичного оновлення search_vector
, коли змінюються title
або content
:
CREATE OR REPLACE FUNCTION update_search_vector()
RETURNS trigger AS $$
BEGIN
NEW.search_vector = to_tsvector('english', NEW.title || ' ' || NEW.content);
RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsvector_update BEFORE INSERT OR UPDATE
ON articles FOR EACH ROW
EXECUTE FUNCTION update_search_vector();
Фінальний жарт:
Чому база даних залишила свою дружину? Бо вона була в відносинах один-до-багатьох.
Кейс-стаді
1. E-commerce
Дозвольте клієнтам шукати продукти за ключовими словами, такими як "shoes"
або "red sneakers"
.
2. Блоги
Покращіть пошук у вашому блозі, щоб користувачі могли знаходити статті за темами, тегами або навіть точними фразами.
3. Підтримка
Дозвольте користувачам швидко знаходити FAQ або посібники з усунення несправностей, набираючи ключові слова.
Висновок
Повнотекстовий пошук PostgreSQL — це як супергерой, якого ваша база даних навіть не знала, що їй потрібен. Він швидкий, гнучкий і достатньо розумний, щоб обробляти особливості природної мови. Незалежно від того, чи будуєте ви блог, інтернет-магазин або портал підтримки, FTS може зробити вашу функцію пошуку з середньої на вау.
Фінальний жарт:
Чому SQL-запит перейшов через дорогу?
Щоб приєднатися до іншої таблиці.
Перекладено з: Supercharge Your Search: A Beginner’s Guide to PostgreSQL Full-Text Search