按相关性查询和排序

时间:2013-02-05 12:39:37

标签: sql postgresql postgresql-performance

我在这样的查询中有多个条件:

SELECT * FROM image WHERE name LIKE '%text%' AND group_id = 10 LIMIT 1

WHERE语句包含3个条件:

  • 文字匹配
  • 外键匹配

如果我想按相关性对结果进行排序,具体取决于:

  1. 文字的匹配程度
  2. 完全符合条件(例如文本匹配外键)
  3. 这是两个问题,但我认为有些时候这些问题会在一起使用。在这里,我指的是一个由我的前职位(Way to try multiple SELECTs till a result is available?)引起的问题。

    提前致谢!

1 个答案:

答案 0 :(得分:4)

要知道文本的匹配方式,您需要fuzzystrmatch PostgreSQL模块。它提供differencelevenshtein等函数,可以估算两个字符串之间的相似性。

然后,您可以使用以下条件构建查询:

SELECT *
  FROM image
 WHERE name LIKE '%text%' 
   AND ( group_id = 10 
         OR second_field = 4
         OR thirth_field = 5
       )
ORDER BY ( (group_id=10)::int
           + (second_field=4)::int
           + (thirth_field=5)::int
         ) * weight_1
         + (strlen(name)-levenshtein('text',name))* wheight_2

您可以调整weight_1weight_2以优先考虑文字距离或遇到的条件数。