MySQL Search (сортировка по релевантности) - PullRequest
1 голос
/ 11 марта 2010

Может ли кто-нибудь помочь мне, как отсортировать строки по релевантности по следующему критерию?

`tbluser`
- - - - - - -
First Name
Last Name

`tbleduc`
- - - - - - -
School
College
University

В форме поиска у пользователя есть следующие поля

Name
School
College
University

, где школьный колледж и университет являются факультативными.

И Имя разбито на 2 слова (остальные слова в середине опущены), первое слово берется как первое anme, а последнее слово как фамилия ..

Теперь я хотел бы реализовать поиск по релевантности.

Спасибо за помощь:)

Ответы [ 4 ]

5 голосов
/ 21 марта 2010

Хорошо, я попробовал это для вас на Postgres (у меня нет MySQL здесь, так что, может быть, это немного по-другому):

select matches.id,
      (matches.tfirstname
       + matches.tlastname 
       + matches.tschool
       + matches.tcollege
       + matches.tuniversity) as total
from (
   select u.id,
          (case when u.firstname like '%a%' then 1 else 0 end) as tfirstname,
          (case when u.lastname like '%b%' then 1 else 0 end) as tlastname,
          sum(e2.nschool) as tschool,
          sum(e2.ncollege) as tcollege,
          sum(e2.nuniversity) as tuniversity
   from tbluser u left outer join (
      select e.usr,
             (case when e.school like '%c%' then 1 else 0 end) as nschool,
             (case when e.college like '%d%' then 1 else 0 end) as ncollege,
             (case when e.university like '%e%' then 1 else 0 end) as nuniversity
      from tbleduc e
   ) e2 on u.id=e2.usr
   group by u.id, u.firstname, u.lastname
) as matches

Я использовал эти операторы DDL для создания таблиц:

create table tbluser (
  id int primary key,
  firstname varchar(255),
  lastname varchar(255)
)


create table tbleduc (
  id int primary key,
  usr int references tbluser,
  school varchar(255),
  college varchar(255),
  university varchar(255)
)

И немного примеров данных:

insert into tbluser(id, firstname, lastname)
            values (1, 'Jason', 'Bourne');
insert into tbleduc(id, usr, school, college, university)
            values (1, 1, 'SomeSchool', 'SomeCollege', 'SomeUniversity');
insert into tbleduc(id, usr, school, college, university)
            values (2, 1, 'MoreSchool', 'MoreCollege', 'MoreUniversity');

Запрос можно немного упростить, если соотношение между tbluser и tbleduc равно 1: 1.

Не забудьте заменить %a%, %b, ... вашими переменными (я рекомендую использовать подготовленный оператор).

Я надеюсь, что этот шаблон поможет в качестве базового решения - вы можете настроить его так, как вам нравится :-) Вы также можете удалить самый внешний оператор select, чтобы получить счетчики отдельных результатов.

1 голос
/ 24 марта 2010

Вы пробовали сопоставить запрос с вашим столом? Результирующий набор отсортирован по релевантности по умолчанию. Плюс это делает Полнотекстовый поиск.

1 голос
/ 11 марта 2010

Шаг 1. Определите метод вычисления «релевантности».

Шаг 2: Напишите запрос, который использует вычисления из шага 1 для определения порядка его результатов.

К сожалению, вы не указали, что делает одну запись "более актуальной" или "менее актуальной", чем другая, так что это примерно столько, сколько мы можем вам сказать.

0 голосов
/ 23 марта 2010

Есть ли у вас время и ресурсы, чтобы попытаться реализовать Solr ? Это намного лучше для поиска по релевантности, и на удивление легко начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...