我正在为FAQ列表编写一些非常简单的搜索功能。我正在将搜索字符串拆分为各种字符,包括空格。然后根据以下内容执行选择
SELECT * FROM "faq" WHERE ((LOWER("Question") LIKE '%what%' OR LOWER("Question") LIKE '%is%' OR LOWER("Question") LIKE '%a%' OR LOWER("Question") LIKE '%duck%'))
我不得不对其进行稍微的编辑,使其由我们的数据访问层生成,但是它应该使您对发生的事情有所了解。
上面的查询很好地说明了这个问题,因为大多数问题中可能都包含单词a或is,但是我无法将其过滤掉,因为首字母缩略词对搜索者而言很重要。建议的是,我们根据匹配关键字的数量进行排序。但是,我一直找不到在SQL中执行此操作的方法(我们没有时间用关键字等的索引来创建简单的搜索引擎)。有谁知道是否有一种方法可以计算SQL语句中LIKE匹配的数量并以此排序,以使关键字最多的问题出现在结果的顶部?
我假设匹配的关键字列表是由用户输入的,并且在执行查询之前由应用程序动态地插入到查询中。如果是这样,我建议像这样修改查询:
SELECT * FROM "faq" WHERE ((LOWER("Question") LIKE '%what%' OR LOWER("Question") LIKE '%is%' OR LOWER("Question") LIKE '%a%' OR LOWER("Question") LIKE '%duck%')) order by case when LOWER("Question") LIKE '%what%' then 1 else 0 end + case when LOWER("Question") LIKE '%is%' then 1 else 0 end + case when LOWER("Question") LIKE '%a%' then 1 else 0 end + case when LOWER("Question") LIKE '%duck%' then 1 else 0 end descending;
假设用户(或算法)可以为每个选择项分配权重,这甚至可以使您“加权”每个选择项的重要性。
一个警告:如果您的查询是动态构建的,您是否意识到SQL插入 攻击的风险?