加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在SQLite FTS3搜索中包含部分匹配

发布时间:2020-12-12 18:51:35 所属栏目:百科 来源:网络整理
导读:我的简单SQLite FTS3实现当前将用户查询与存储结果进行匹配,并返回它们,只要这些结果包含用户查询中的所有单词(换句话说,FTS表是使用简单的标记化器创建的). 现在,我想让搜索更加智能化,我希望它能够根据查询中匹配结果的单词数对结果进行排名/排序.例如, SE
我的简单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结果,但这样效率会相当低.

解决方法

这是一个未经考验的想法.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读