【问题标题】:MySQL - Search/SELECT which is ordered by relevance?MySQL - 按相关性排序的搜索/选择?
【发布时间】:2011-06-17 19:44:26
【问题描述】:

我的表格设置如下:

用户ID年份模型颜色传输内部颜色轮子 -------------------------------------------------- ----------------- 1 2005 嘉年华红 MT 黑色库存 2 2008 Monaro Red AT 黑色库存 3 2005 F-150S 蓝色 AT 黑色 + 红色库存 4 2008 嘉年华绿色 MT 黑色股票

现在我正在构建 SQL 搜索(全文搜索中没有标准构建),并且我希望结果具有一定的相关性。

我的意思是,例如,如果有人输入“2008 Fiesta”,现在通过基本查询,结果会按此顺序显示

id #1,id #2,id #4

但实际上我希望 #4 在这种情况下位于搜索的顶部,因为它匹配我在两个字段而不是一个字段上的搜索。

谢谢!

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您可能想看看使用 Lucene(或在 Lucene 之上的 SOLR),而不是依赖 MySQL 来完成类似的事情。您仍然可以将真实数据存储在 MySQL 中。我使用的一般设置是 SOLR/Lucene 进行全文/相关性搜索以获取我感兴趣的实体的 ID,然后点击 MySQL 来获取这些实体的实际数据。使用 SOLR/Lucene 可为您提供全文搜索,并在搜索/排序数据的方式上增加了更多功能,此外还提供了词干提取等功能。

    【讨论】:

    • 这也取决于数据集的大小。对于小型数据集,MySQL 可以毫无问题地进行搜索。对于大量数据,有更好的选择,例如 Lucene 或 Xapian。
    • 确实如此。我放弃了 Lucene 作为一个选项,因为他在询问相关性时提到了全文搜索。这两个一起将我引向了一个真正的搜索引擎。
    【解决方案2】:

    这是粗略的,但它应该适合你:

    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
    

    基本上,它对每个条件进行搜索,将它们全部合并在一起,然后按相关性总和对它们进行分组和排序(每个匹配项获得一分)。

    【讨论】:

    • 但是现在你假设模型和年份是分开的,如果是全文搜索,情况就不是这样了。
    • @joakimdahlstrom - 根据 OP,“全文搜索没有标准构建”。我假设 OP 会以某种方式分解字符串的各个部分。这就是 PHP 代码可能会出现的地方。
    • 哇,效果很好!你知道我怎么可以扩展它,所以它不仅贯穿年份和模型字段,而且贯穿我所有的字段(并且实际的字段列表实际上比我在这里发布的更长),而且关键字也会很长条目,例如搜索文本将是“2008 red Fiesta”。在您的 sql 中,已经分配了相关的关键字。无论如何要让它对现实世界的搜索请求更通用?谢谢!!!
    【解决方案3】:

    我认为你的select 声明是这样的:

    LIKE %2008 Fiesta%
    

    尝试使用最后一个%,它会起作用

    【讨论】:

    • 如果您使用“Fiesta 2008”搜索结果会是空的?
    猜你喜欢
    • 2011-01-26
    • 2010-09-25
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多