计数和排序,以何处条款匹配[英] Count and Order By Where clause Matches

本文是小编为大家收集整理的关于计数和排序,以何处条款匹配的处理方法,想解了计数和排序,以何处条款匹配的问题怎么解决?计数和排序,以何处条款匹配问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在为常见问题解答列表编写一些非常简单的搜索功能.我将搜索字符串拆分为各种字符,包括空格.然后沿

行执行选择
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 插入 攻击?

本文地址:https://www.itbaoku.cn/post/1764089.html