如何在SQL中按相关性(包括词序)排序
我正在创建一个“智能”搜索引擎,通过关联性来查看数据库。我的系统计算您的句子中有多少单词对应于包含文本的数据库字段“tag_clean”,并尝试获得正确的结果(每个研究一个) 例如,在tag_clean字段中显示“search youpla boom”,如果录制“search bim”,则会显示第二个条目,如“search youpla bim” 我的系统为每个单词设置一个点,并得到最相关的结果。一切正常,但我最大的问题是,它完全忽略了单词顺序 如果你有“谷歌图像测试”和“谷歌测试”,你用我的系统搜索“谷歌测试图像”,最相关的将是第一个,但第二个是正确的 我想要一个能够理解词序重要性的系统,但我不知道如何在SQL中做到这一点 我的SQL请求的一个示例(重要部分是CASE WHEN结尾):如何在SQL中按相关性(包括词序)排序,sql,words,relevance,sql-order-by,Sql,Words,Relevance,Sql Order By,我正在创建一个“智能”搜索引擎,通过关联性来查看数据库。我的系统计算您的句子中有多少单词对应于包含文本的数据库字段“tag_clean”,并尝试获得正确的结果(每个研究一个) 例如,在tag_clean字段中显示“search youpla boom”,如果录制“search bim”,则会显示第二个条目,如“search youpla bim” 我的系统为每个单词设置一个点,并得到最相关的结果。一切正常,但我最大的问题是,它完全忽略了单词顺序 如果你有“谷歌图像测试”和“谷歌测试”,你用我的系
谢谢大家:)首先,我不确定原始SQL是否是最好的工具。您应该了解您正在使用的任何引擎的全文功能。搜索文本是一个相当解决的问题,数据库支持此功能(通过对基础语言的扩展) 假设您想继续,问题在于您的结构。您可以开始为标记清除添加额外的子句,如“%googletest%”和每隔一个双向组合。这可能是一个快速而肮脏的解决方案 您真正的问题是将关系数据存储在单个字段中。应该有一个关键字表,每个文档上的每个关键字都有一个单独的行。这将包含以下列:documentID、KeyWord和KeyWordPosition。使用关键字Position,您可以开始执行所需的邻近搜索
不过,您最好研究现有软件中的全文功能。您说得对,我已经考虑过这个“肮脏”的解决方案,但我想要干净的:)您的系统可以很好,我会考虑的,谢谢您,伙计:)
SELECT *
FROM keywords
WHERE tag_clean LIKE 'google%'
AND (static = 0)
AND
(
tag_clean LIKE '%google%'
OR tag_clean LIKE '%test%'
OR tag_clean LIKE '%image%'
)
OR
(
tag_clean = 'google test image'
AND static = 1
)
ORDER BY
((CASE WHEN tag_clean LIKE '%google%' THEN 1 ELSE 0 END)
+ (CASE WHEN tag_clean LIKE '%test%' THEN 1 ELSE 0 END)
+ (CASE WHEN tag_clean LIKE '%image%' THEN 1 ELSE 0 END))
DESC LIMIT 0, 1;