任何人都可以帮助我按照以下标准对相关行进行排序吗?
`tbluser`
- - - - - - -
First Name
Last Name
`tbleduc`
- - - - - - -
School
College
University
在搜索表单上,用户有以下字段
Name
School
College
University
学院和大学是可选的......
名称分为2个单词(中间的其他单词省略),第一个单词作为第一个anme,最后一个单词作为姓氏。
现在我想基于相关性实现搜索。
感谢您的帮助:)
答案 0 :(得分: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');
如果tbluser
和tbleduc
之间的关系为1:1,则可以简化查询。
不要忘记用变量替换%a%
,%b
,...(我建议使用准备好的声明)。
我希望这个模板有助于作为一个基本的解决方案 - 你可以随意调整它:-)你也可以删除最外面的select语句,以获得各个结果的计数器。
答案 1 :(得分:1)
步骤1:定义计算“相关性”的方法。
步骤2:编写一个查询,该查询使用步骤1中的计算来确定其结果的顺序。
不幸的是,你还没有说明是什么让一条记录比另一条记录更“相关”或“更不相关”,所以这就像我们在这一点上可以告诉你的那样。
答案 2 :(得分:1)
您是否在桌面上尝试过Match - Against查询。结果集按相关性y default排序。另外它还可以进行全文搜索。
答案 3 :(得分:0)
您是否有时间和资源尝试实施Solr?对于相关性排名的搜索来说,它要好得多,并且开始时非常容易。