Пошук по базі даних з сортуванням за релевантністю
Відео: Урок №3. Пошук і сортування даних
Нещодавно мені потрібно було для одного із замовників зробити пошук, причому не просто висновок всіх збігів, а ще й з сортуванням по релевантності. Багато програмістів (та й я теж раніше так робив) виведуть всі збіги, а потім вже в PHP починають сортувати за релевантністю. Однак, в SQL є вже відмінна можливість пошуку по базі даних з сортуванням за релевантністю.
Єдина умова - це зробити поля, за якими буде йти пошук, ключами FULLTEXT. А тепер сам запит:
SELECT *, MATCH `field` AGAINST (`$ Search`)as relev FROM `table` ORDER BY relev DESC
В даному запиті шукаються відповідності в поле "field"Ключовому запиту $ search (Там може бути багато слів). А певна кількість відповідностей потрапляє в змінну relev (По суті, релевантність), по якій потім відбувається сортування за убуванням. І це буде відбуватися для кожного запису в таблиці.
Все начебто добре, проте, якщо Ви виконаєте цей запит, то з подивом виявите, що щоб ви не підставляли в $ search, а у вибірці будуть абсолютно всі записи. Чому? А тому, що ми не написали WHERE, тому навіть там, де "relev = 0"(Тобто взагалі нічого не знайдено), є одним з результатом вибірки. І ось змінений SQL-запит буде таким:
SELECT *, MATCH `field` AGAINST (`$ Search`)as relev FROM `table` WHERE MATCH `field` AGAINST (`$ Search`) Gt;0 ORDER BY relev DESC
З таким запитом записів без єдиного збіги в вибірці вже не буде, а все ті, де знайдено відповідності, будуть відсортовані за релевантністю.
Відео: 29 Пошук в базі даних
А що робити, якщо нам потрібно зробити пошук відразу по двома полями? Тут є 2 варіанти, якщо Ви створите 1 загальний FULLTEXT для двох полів, то можна написати так:
SELECT *, MATCH `field_1`,`field_2` AGAINST (`$ Search`)as relev FROM `table` WHERE MATCH `field_1`,`field_2` AGAINST (`$ Search`)gt;0 ORDER BY relev DESC
А якщо загальний ключ створювати не хочете, то тоді треба виконати такий запит (кожне з полів має бути FULLTEXT):
SELECT *, MATCH `field_1` AGAINST (`$ Search`)+ MATCH `field_2` AGAINST (`$ Search`)as relev FROM `table` WHERE MATCH `field_1` AGAINST (`$ Search`)+ MATCH `field_2` AGAINST (`$ Search`)gt;0 ORDER BY relev DESC
Але вся принадність даного пошуку по базі даних з сортуванням за релевантністю полягає в тому, що він виконується дуже швидко. Набагато швидше, ніж якщо Ви будете орудувати строковими функціями PHP в масивах з записами. Тому рекомендую використовувати даний SQL-запит при пошуку в більшості випадків, навіть коли не потрібно висновок за релевантністю.
- Опис і застосування функції concat в sql.
- Як знайти помилку в sql-запиті
- Як дізнатися синтаксис sql-запиту через phpmyadmin
- Як збільшити значення поля на 1 через sql
- Як дізнатися розміри таблиці через sql
- Сортування в sql по одному полю, потім по іншому
- Конструкція where в sql
- Відновлення поля пошук в меню пуск
- Запит sql на створення і видалення бази даних
- Випадкова вибірка з бази даних
- Чутливі до регістру пошук для mysql
- Реалізація пошуку на сайті через php
- Знайомство з phpmyadmin
- Sql-запити для роботи з таблицями
- Slip.js - простий список з сортуванням і видаленням свайпамі.
- Запит sql на вибірку певного числа записів
- Запит sql на створення індексу
- Пошук в інтернеті
- Пошук по файлах на php
- Подвійна сортування на sql
- Проблеми з кодуванням в базі даних