Пошук по базі даних з сортуванням за релевантністю

Відео: Урок №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-запит при пошуку в більшості випадків, навіть коли не потрібно висновок за релевантністю.

Поділися в соціальних мережах:

Схожі
Реалізація пошуку на сайті через phpРеалізація пошуку на сайті через php
Опис і застосування функції concat в sql.Опис і застосування функції concat в sql.
Запит sql для сортування результату вибіркиЗапит sql для сортування результату вибірки
Сортування в sql по одному полю, потім по іншомуСортування в sql по одному полю, потім по іншому
Як знайти помилку в sql-запитіЯк знайти помилку в sql-запиті
Запит sql на створення індексуЗапит sql на створення індексу
Чутливі до регістру пошук для mysqlЧутливі до регістру пошук для mysql
Випадкова вибірка з бази данихВипадкова вибірка з бази даних
Як збільшити значення поля на 1 через sqlЯк збільшити значення поля на 1 через sql
Пошук в інтернетіПошук в інтернеті
» » Пошук по базі даних з сортуванням за релевантністю