3

我的简单 SQLite FTS3 实现目前将用户查询与存储的结果匹配并返回它们,只要这些结果包含用户查询中的所有单词(换句话说,FTS 表是使用简单的标记器创建的)。

现在,我想让搜索更加智能,我希望它根据查询中匹配结果的单词数对结果进行排名/排序。例如,

SELECT name FROM nametable WHERE name MATCH 'fast food restaurant'  

目前返回

SUBWAY FAST FOOD RESTAURANT
MCDONALDS FAST FOOD RESTAURANT

应该返回

SUBWAY FAST FOOD RESTAURANT
MCDONALDS FAST FOOD RESTAURANT
CHIPOTLE FAST FOOD
PIZZA FAST FOOD
GOOD FOOD OUTLET

以该顺序。换句话说,搜索输出不应局限于必然包含用户查询的所有单词的结果,而是将包含所有单词的结果放在列表中较高的位置,同时为返回部分匹配的结果留出空间。

一种简单的方法是使用用户输入的所有排列运行多个查询,并以所需的顺序对结果进行 UNION,但这将是相当低效的。

4

2 回答 2

7

更容易做到:

SELECT name FROM nametable WHERE name MATCH 'fast OR food OR restaurant'

无需处理多个查询。

于 2014-02-14T20:23:48.160 回答
2

这是一个未经检验的想法。

SELECT name
FROM (
      SELECT name, 1 as matched
      FROM nametable
      WHERE name MATCH 'fast'
    UNION ALL
      SELECT name, 1 as matched
      FROM nametable
      WHERE name MATCH 'food'
    UNION ALL
      SELECT name, 1 as matched
      FROM nametable
      WHERE name MATCH 'restaurant'
  )
GROUP BY name
ORDER BY SUM(matched) DESC, name
于 2011-07-01T05:51:05.667 回答