Sql 按多列对数据库条目进行评分

Sql 按多列对数据库条目进行评分,sql,scoring,Sql,Scoring,我面临的情况是,我必须为用户的搜索请求找到最佳匹配项。我将提供一个示例(有点抽象): 我们有一张律师桌: Name Location Royality Family Law Criminal Law ------------------------------------------------------------- Lawyer A Berlin 100 €/hour false true Lawyer B Amsterdam

我面临的情况是,我必须为用户的搜索请求找到最佳匹配项。我将提供一个示例(有点抽象):

我们有一张律师桌:


Name       Location   Royality    Family Law   Criminal Law
-------------------------------------------------------------
Lawyer A   Berlin     100 €/hour  false        true
Lawyer B   Amsterdam  150 €/hour  true         true
用户现在应该能够通过多种功能进行搜索。每个特征的权重应该是某种参数。在我的例子中,这个表包含了更多这样的特性(位置、版税、20+布尔值)。当然,结果应该提供所有“好”的结果,但按某种“分数”排序,因此最好的结果出现在顶部

我不是在寻找一个开箱即用的解决方案,而是对这个主题的介绍

亲切问候,


matt

一种通用方法是为每个项目分配一个权重,并在匹配时将它们相加。这将导致对每条记录进行全表扫描评分

假设柏林输入值>100/小时,刑法=正确,家庭法=无效(无标准) 位置匹配的权重为5

select *
from (
    select *,
      case when location = 'berlin' then 5 else 0 end +
      case when royality >= 100 then 1 else 0 end +
      case when familylaw = null then 1 else 0 end +
      case when criminallaw = true then 1 else 0 end as score
    from tbl
) scored
order by score desc

一种通用的方法是为每个项目分配一个权重,并在匹配时将它们相加。这将导致对每条记录进行全表扫描评分

假设柏林输入值>100/小时,刑法=正确,家庭法=无效(无标准) 位置匹配的权重为5

select *
from (
    select *,
      case when location = 'berlin' then 5 else 0 end +
      case when royality >= 100 then 1 else 0 end +
      case when familylaw = null then 1 else 0 end +
      case when criminallaw = true then 1 else 0 end as score
    from tbl
) scored
order by score desc

您可以在特定的RDBMS中使用SOUNDEX函数。它们比较两个字符串,并给出“它们听起来有多相似”的数值


如Richard所述,您可以对每列的结果进行加权和/或求和。

您可以在特定的RDBMS中使用SOUNDEX函数。它们比较两个字符串,并给出“它们听起来有多相似”的数值


然后,您可以对Richard提到的每列结果进行加权和/或求和。

hi Richard。我希望有任何方法都不会导致全表扫描。然而,这个例子对我来说是一个很好的起点。谢谢如果要检查整个表的结果,需要进行整个表扫描。避免这种情况的唯一方法是使用某种机制,在不计算分数的情况下包含或排除行。例如,您可以确定匹配位置的第一个字母是必需的,并添加WHERE子句以排除不符合此类条件的字母。然而,RDBMS无法神奇地知道哪些记录有什么分数,因此无法避免计算他们的分数……这样做是好还是坏:WHERE(criminallaw_required&&criminallaw=@criminallaw)?对于n列,它的性能会很好吗?通过使用内部查询中的WHERE,可以避免全表扫描。您将只有一个结果集表扫描,您可以从一开始就将其限制为可管理的大小。只是说,你好,理查德。我希望有任何方法都不会导致全表扫描。然而,这个例子对我来说是一个很好的起点。谢谢如果要检查整个表的结果,需要进行整个表扫描。避免这种情况的唯一方法是使用某种机制,在不计算分数的情况下包含或排除行。例如,您可以确定匹配位置的第一个字母是必需的,并添加WHERE子句以排除不符合此类条件的字母。然而,RDBMS无法神奇地知道哪些记录有什么分数,因此无法避免计算他们的分数……这样做是好还是坏:WHERE(criminallaw_required&&criminallaw=@criminallaw)?对于n列,它的性能会很好吗?通过使用内部查询中的WHERE,可以避免全表扫描。您将只有一个结果集表扫描,您可以从一开始就将其限制为可管理的大小。只是说说而已。