2010-03-11 122 views
1

任何人都可以幫助我如何按以下標準對行進行相關性排序嗎?MySQL搜索(按相關性排序)

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

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

在搜索表單用戶以下字段

Name 
School 
College 
University 

凡學校學院和大學是可選..

而且名稱被分成2個字(在中間換句話說省略),第一個字作爲第一ANME和最後一個字作爲姓​​氏..

現在我想實現基於相關性的搜索。

感謝您的幫助:)

回答

5

好吧,我想這對你的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'); 

查詢可以簡化一個位,如果相對tblusertbleduc之間的關係是1:1。

不要忘記用你的變量替換%a%%b,...(我建議使用準備好的語句)。

我希望這個模板幫助作爲一個基本的解決方案 - 你可以調整它,就像你喜歡:-)你也可以去除最外面的SELECT語句,以獲得個人成績的計數器。

1

第1步:定義一個計算「相關性」的方法。

步驟2:收件其使用來自步驟1的計算,以確定其結果的順序的查詢。

不幸的是,你還沒有說是什麼讓一個記錄「更相關」或比另一種「不太相關」,所以這大約相當於我們可以在這一點告訴你。

+0

相關性先由更多匹配項計算。比如像'name','school'和'college'這樣的搜索詞應該出現在與'name'和'school'匹配的字段的頂部 – 2010-03-13 11:51:44

0

你有足夠的時間和資源來嘗試實現Solr?相關度排名搜索的效果要好得多,而且開始使用起來也非常容易。

1

你有沒有嘗試過的比賽 - 你的桌子上反對的查詢。結果集按相關性默認排序。另外它做全文搜索。

相關問題