2012-09-14 26 views
0

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

例如,您在tag_clean字段中搜索“youpla boom”,如果您搜索“搜索bim”,则会显示第二个条目,如“搜索youpla bim”。

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

如果您有'谷歌图片测试'和'谷歌测试',并且您使用我的系统搜索'谷歌测试图片',最相关的将是第一个,但是它是第二个正确的。

我想要一个理解单词顺序重要性的系统,但我不知道如何在SQL中完成它。

我的SQL请求的样品(重要的部分是当在端部盒):

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; 

谢谢大家:)

回答

1

首先,我不知道原始的SQL是最好的为此的工具。你应该看看你正在使用的任何引擎的全文功能。搜索文本是一个相当成功的问题,数据库支持这种功能(通过对基本语言的扩展)。

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

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

但是,您可能更适合在现有软件中调查全文功能。

+0

你是对的,我已经想过这个'肮脏'的解决方案,但我想干净的东西:) 你的系统可以很好,我会考虑一下,谢谢你:) –