【问题标题】:How to order by relevancy including word order in SQL如何按相关性排序,包括 SQL 中的词序
【发布时间】:2012-09-07 19:34:44
【问题描述】:

我正在创建一个“智能”搜索引擎,它将通过相关性查看数据库。我的系统会计算你的句子中有多少单词对应于包含文本的数据库字段“tag_clean”,并尝试得到正确的结果(每个研究一个)。

例如,您在 tag_clean 字段中获得“search youpla boom”,如果您录制“search bim”,则另一个条目(如“search youpla bim”)将显示第二个条目。

我的系统为每个单词设置一个点,并获得最相关的结果。一切正常,但我最大的问题是,它完全忽略了单词 order!

如果你有 'google image test' 和 'google test' 并且你用我的系统搜索 'google test image',最相关的将是第一个,但它是第二个是正确的。

我想要一个理解词序重要性的系统,但我不知道如何在 SQL 中做到这一点。

我的 SQL 请求示例(重要部分是最后的 CASE WHEN):

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;

谢谢大家:)

【问题讨论】:

    标签: sql words relevance sql-order-by


    【解决方案1】:

    首先,我不确定原始 SQL 是否是解决此问题的最佳工具。您应该查看您使用的任何引擎的全文功能。搜索文本是一个相当已解决的问题,并且数据库支持此功能(通过对基础语言的扩展)。

    假设您想继续,问题在于您的结构。您可以开始为标签清除添加额外的子句,例如 '%google test%' 和所有其他双向组合。这可能是一个快速而肮脏的解决方案。

    您真正的问题是您将关系数据存储在单个字段中。应该有一个关键字表,每个文档上的每个关键字都有一个单独的行。这将包含以下列:documentID、KeyWord 和 KeyWordPosition。使用 KeyWordPosition,您可以开始进行所需的邻近搜索。

    但是,您最好研究现有软件中的全文功能。

    【讨论】:

    • 你说得对,我已经考虑过这个“肮脏”的解决方案,但我想要一些干净的东西 :) 你的系统可以很好,我会考虑的,谢谢你 :)跨度>
    猜你喜欢
    • 1970-01-01
    • 2014-02-22
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2012-09-28
    • 2011-08-26
    • 2011-01-26
    相关资源
    最近更新 更多