2011-06-17 55 views
1

我有一个表的设置如下:MySQL - 按相关性排序的Search/SELECT?

 
userid year model color transmission interiorcolor wheels 
------------------------------------------------------------------- 
    1 2005 Fiesta Red MT    Black  Stock 
    2 2008 Monaro Red AT    Black  Stock 
    3 2005 F-150S Blue AT   Black + Red Stock 
    4 2008 Fiesta Green MT   Black  Stock 

现在我建立一个SQL搜索(没有标准建立全文搜索),我想结果是有点相关。

我的意思是,例如,如果有人类型的“2008嘉年华”,现在有一个基本的查询结果顺序出来

ID#1,ID#2,ID#4

但我真的希望#4在搜索的顶部,因为它符合我在两个领域而不是一个领域的搜索。

谢谢!

回答

0

这是原油,但它应该为你工作:

SELECT id, SUM(Relevance) as SearchRelevance 
FROM(
SELECT id, 1 as Relevance 
FROM cars 
WHERE year = 2008 
UNION ALL 
SELECT id, 1 as Relevance 
FROM cars 
WHERE model='Fiesta') AS t 
GROUP BY id 
ORDER BY SUM(Relevance) DESC 

基本上它搜索每个标准,将它们联合在一起,然后通过相关性SUM对它们和顺序进行分组(每个匹配项只得到一个点) g项)。

+0

但现在你假设模型和年份是分开的,如果是全文搜索则不是这种情况。 – joakimdahlstrom

+0

@joakimdahlstrom - 根据OP,“全文搜索没有标准版本”。我假设OP会以某种方式打破字符串的部分。这是PHP代码可能会进入的地方。 – IAmTimCorey

+0

哇,效果非常好!你知道我怎么能扩大它,所以它不仅仅贯穿于年份和模型领域,而且我所有的领域(和真正的领域列表实际上比我在这里发布的领域长),关键字也会是一个长条目,搜索文本将以“2008红色嘉年华”为例。在你的sql中,相关的关键字已经被赋值了。无论如何,让它更一般的真实世界搜索请求?谢谢!!! – Mark

0

我觉得你select说法是这样的:

LIKE %2008 Fiesta% 

尝试采取最后%,它会工作

+0

如果您使用搜索“Fiesta 2008”,结果将是空的? – Arjan

1

你可能想看看使用Lucene(或Lucene之上的SOLR),而不是像这样依赖于MySQL。您仍然可以将您的真实数据存储在MySQL中。我使用的一般设置是SOLR/Lucene进行全文本/相关性搜索以获取我感兴趣的实体的ID,然后打到MySQL以获取这些实体的实际数据。使用SOLR/Lucene可以为您提供全文搜索功能,并且可以通过搜索/排序数据的方式增加更多功能,并且还提供了诸如词干之类的功能。

+0

它也取决于数据集的大小。对于小数据集,MySQL可以在没有严重问题的情况下进行搜索。对于大量的数据,有更好的选择,例如Lucene或Xapian。 – Arjan

+0

确实够了。我将Lucene作为一个选项抛出,因为他提到了全文搜索,同时询问了相关性。这两个人一起指向一个实际的搜索引擎。 – RHSeeger