在我的应用程序(PHP / MySQL / JS)中,我有一个内置的搜索功能。其中一个搜索条件包含各种选项的复选框,因此,某些结果会比其他结果更相关,如果它们包含更多每个选项的更少或更少。
某人之前,我只是在做基于表单输入的简单SQL查询,但这个问题有点困难,因为它并不像数据LIKE“%query%”那么简单,而是某些结果对某些人来说更有价值搜索查询,有些则不是。即。选项是A和B,如果我搜索选项A和B,则仅包含选项A的结果1是50%相关的,而包含选项A和B的结果2是100%相关的。
我完全不知道从哪里开始......有没有人有相关的(哈!)阅读材料来指导我?
编辑:仔细考虑后,我正在考虑使用SQL脚本来获取原始数据,然后进行多轮解析是我必须要做的事情......
但是没有什么可以缓存的吗? :(
答案 0 :(得分:2)
看一下lucence项目 它有多种语言版本
这是php端口 http://framework.zend.com/manual/en/zend.search.lucene.html
它索引要搜索的项目并返回相关的加权搜索结果,例如更好然后从y中选择x,其中名称如'%pattern%'样式搜索
答案 1 :(得分:1)
你需要的是一个强大的搜索引擎,比如solr。虽然你可以在mysql之上实现它,但它已经提供了开箱即用的其他工具。
答案 2 :(得分:1)
这是一个想法:进行比较并总结结果。总和越高,标准匹配就越多。
这样的(愚蠢的)表怎么样:
找到与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)
祝你好运。
答案 3 :(得分: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的项目,但具有这两个选项的项目似乎排名更高。
如果您正在搜索2个选项,这很有效。但是我们假设您搜索了所有3个选项。现在所有项目都具有相同的强度,这就是为选项分配“权重”的重要原因。
您可以将值赋予您的力量,但如果您的查询并不总是为相同的选项分配相同的权重,则可能无法帮助您。这可以通过以下查询在每个查询的基础上轻松实现:
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
尝试查询,看看它是否是你需要的。
我还想指出,就处理能力而言,这不是最佳解决方案。我建议你添加索引,使选项字段为整数,尽可能缓存结果。
如果您有任何疑问或需要添加任何内容,请发表评论。