|
|
|
| Имеется таблица пользователей и нужно реализовать поиск людей.
На входе строка. Возможно в формате Имя Фамилия или Фамилия Имя, заранее это не известно. Может быть только Имя или только Фамилия. Возможно просто с каким-то словом, например "Пельмень".
На выходе: список людей, которые имеют совпадение с введенной фразой.
Поиск происходит по следующим полям:
- Имя
- Фамилия
- Метки
На самом деле метки представляют из себя отдельную таблицу, но сейчас это не важно.
Нужно вывести людей в следующем порядке:
- сначала те, кто имеют полное совпадение с Имя Фамилия
- затем только с Имя или только с Фамилия
- те, у кого в метках присутствует введенное слово
Как я понимаю, нужно каждому результату выборки присвоить свой вес, при полном совпадении он будет большой, если совпало только имя, то меньше. Если поисковая фраза нашлась только в метках, то еще меньше. И вывести результат, предварительно отсортировав по весам.
Конкретный вопрос: как лучше сделать выборку людей сначала полностью совпадающих с введенной строкой, затем только по имени или по фамилии. Возможно это все уложить только в один запрос? Понятно, что можно что-то типа такого:
<?php
/*
$input - массив, состоящий из поисковых слов
Например поисковый запрос "Вася Пупкин"
$input[0] = Вася
$input[1] = Пупкин
*/
//Полное совпадение
$query1 = "SELECT * FROM users WHERE first_name = $input[0] AND last_name = $input[1]";
//Совпадение любого из слов с фамилией
$query2 = "SELECT * FROM users WHERE last_name = $input[0] OR last_name = $input[1]";
//Совпадение любого из слов с именем
$query2 = "SELECT * FROM users WHERE first_name = $input[0] OR first_name = $input[1]";
//Обработка этих запросов
?>
|
Но как в таком случае отсортировать результат по релевантности? Можно ли как-нибудь этот запрос оптимизировать, чтобы он не зависел от количества элементов в массиве? И вообще есть ли более элегантное решение? | |
|
|
|
|
|
|
|
для: Ramilka
(27.10.2009 в 20:20)
| | поиск по fulltext думаю тут справится очень легко и будет именно то что нужно.. все в 1 запросе и с сортировкой по релевантности... | |
|
|
|
|
|
|
|
для: Aidaho
(28.10.2009 в 07:45)
| | в данном случае это не доступно, т.к. БД innoDB | |
|
|
|
|
|
|
|
для: Ramilka
(28.10.2009 в 14:19)
| | а почему нельзя переделать в MyISAM ? | |
|
|
|
|
|
|
|
для: Aidaho
(28.10.2009 в 14:59)
| | Движок InnoDB обычно выбирается не с бухты-барахты. | |
|
|
|
|
|
|
|
для: Trianon
(28.10.2009 в 15:48)
| | это понятно, но чем то можно пренебречь ради удобства... | |
|
|
|
|
|
|
|
для: Aidaho
(28.10.2009 в 16:06)
| | Транзакциями?! | |
|
|
|
|
|
|
|
для: Aidaho
(28.10.2009 в 16:06)
| | и secondary key?
вы немного отклонились от темы. что можете посоветовать именно по моему вопросу? | |
|
|
|