2011-05-04 74 views
1

在我的应用程序(PHP/MySQL/JS)中,我有一个内置的搜索功能。其中一个搜索条件包含各种选项的复选框,因此,某些结果会比其他结果更相关,如果它们包含更多每个选项更少。设计“基于相关性”的搜索?

即选项是A和B,如果我搜索选项A和B,则只包含选项A的结果1为50%相关,而包含选项A和B的结果2为100%相关。

之前,我只是在基于表单输入的基础上进行简单的SQL查询,但这样做有点难,因为它不像数据LIKE“%query%”那么简单,而是有些结果更多对一些搜索查询有价值,有些则不是。

我完全不知道从哪里开始......有没有人有相关的(哈!)阅读材料指导我?

编辑:几番思索,我想一些涉及到一个SQL脚本,以获得原始数据,其次是许多多轮解析后是我必须做...

但是什么都不缓存? :(

+0

选项A和B如何存储在表中? – Khez 2011-05-04 02:52:21

+0

在基于选项的1或0表中。但这最终会混合到其他搜索条件中...... – 2011-05-04 03:01:16

+0

已添加答案,请务必查看并回答问题。 – Khez 2011-05-04 04:12:19

回答

2

看看在lucence项目 它在许多语言

可用这是PHP端口 http://framework.zend.com/manual/en/zend.search.lucene.html

它的索引项进行搜索,并返回相关的加权搜索结果,例如最好从y选择x,其中像%pattern%这样的名称搜索

+0

看起来像全文搜索,这不是我正在寻找的... – 2011-05-04 03:08:01

+0

@ julian,我只是以为你可以从他们使用的加权过程中收集一些东西,因为这基本上是你想要做的。加重你的结果,所以最相关的就是最重要的 – bumperbox 2011-05-04 04:35:10

1

你需要的是一个强大的搜索引擎,就像solr一样,虽然你可以在mysql上实现它,但它已经提供了开箱即用其他工具。

1

这里有一个想法:做比较和总结结果。总和越高,标准越匹配。

怎么样(愚蠢)表是这样的:

  • dob_year
  • dob_month
  • dob_day

找到谁分享最多三个日期的人与3/15/1980组件:

SELECT (dob_year = 1980) + (dob_month = 3) + (dob_day = 15) as strength, name 
from user 
order by strength desc 
limit 1 

良好的WHERE子句和索引将被要求阻止你做一个表扫描,但是......

你甚至可以添加一个权重列,例如

SELECT ((dob_year = 1980)*2) 

祝你好运。

0

鉴于你的答案,我的意见,这里是你将如何做到这一点的例子:

首先表:

CREATE TABLE `items` (
`id` int(11) NOT NULL, 
`name` varchar(80) NOT NULL 
); 
CREATE TABLE `criteria` (
`cid` int(11) NOT NULL, 
`option` varchar(80) NOT NULL, 
`value` int(1) NOT NULL 
); 

随后的一些项目和标准的例子:

INSERT INTO items (id, name) VALUES 
(1,'Name1'), 
(2,'Name2'), 
(3,'Name3'); 

INSERT INTO criteria VALUES 
(1,'option1',1) ,(1,'option2',1) ,(1,'option3',0), 
(2,'option1',0) ,(2,'option2',1) ,(2,'option3',1), 
(3,'option1',1) ,(3,'option2',0) ,(3,'option3',1); 

这将创建3个项目和3个选项并为其分配选项。

现在有多种方式可以通过某种“强度”来订购。其中最简单的是:

SELECT i . * , c1.value + c3.value AS strength 
FROM items i 
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1' 
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3' 
ORDER BY strength DESC 

这会告诉你所有具有选项1或选项3,但那些用这两个选项会出现排“的项目更高

这种运作良好,如果你。我们假设你对所有3个选项进行搜索,现在所有的项目都具有相同的强度,这就是为什么为选项分配“权重”很重要的原因。你的优势的价值,但是如果你的查询不总是把相同的权重分配给任何地方的相同选项,那可能无法帮到你。 y通过以下查询在每个查询的基础上实现:

SELECT i.* , IF(c1.value, 2, 0) + IF(c3.value, 1, 0) AS strength 
FROM items i 
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1' 
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3' 
ORDER BY strength DESC 

尝试查询,看看它是否是你需要的。

我还想指出,这不是处理能力方面的最佳解决方案。我建议你添加索引,使选项字段为整数,尽可能缓存结果。

如果您有任何问题或需要添加任何内容,请发表评论。