当前位置: 首页 > 面试题库 >

在mysql中对多个字段进行加权搜索的最佳方法?

卜凯旋
2023-03-14
问题内容

这是我想做的:

  • 使搜索主题与表格中的多个字段匹配
  • 根据字段的重要性和匹配的相关性对结果进行排序(按该顺序)

例如:假设我有一个博客。然后有人搜索“ php”。结果将显示为:

  • 首先,针对“标题”字段的匹配,按相关性排序
  • 然后,根据相关性对“ body”字段进行匹配
  • 以此类推,以指定的字段…

我实际上是用PHP中的类完成此操作的,但是它使用了大量的UNIONS(很多!),并且随着搜索主题的大小而增长。因此,我担心性能和DOS问题。有人对此有任何线索吗?


问题答案:

进行加权搜索/结果搜索的这种方法可能适合您:

SELECT *,
    IF(
            `name` LIKE "searchterm%",  20, 
         IF(`name` LIKE "%searchterm%", 10, 0)
      )
      + IF(`description` LIKE "%searchterm%", 5,  0)
      + IF(`url`         LIKE "%searchterm%", 1,  0)
    AS `weight`
FROM `myTable`
WHERE (
    `name` LIKE "%searchterm%" 
    OR `description` LIKE "%searchterm%"
    OR `url`         LIKE "%searchterm%"
)
ORDER BY `weight` DESC
LIMIT 20

它使用选择子查询来提供权重以对结果进行排序。在这种情况下,搜索了三个字段,您可以为每个字段指定权重。它可能比联合会便宜,并且可能只是纯MySQL中更快的方式之一。

如果您有更多数据并且需要更快的结果,则可以考虑使用Sphinx或Lucene之类的东西。



 类似资料:
  • 我有一个如下的模型: 它填充了一些数据: 我需要合并/加入一个集合(不是queryset): 所以基本上,当我用这个元组列表搜索这个模型时,第0行和第2行应该返回。 目前,我的解决方法是将 读取到数据帧中,并与元组列表进行合并,并将 ID 传递给 。我还尝试迭代列表并在每个元组上调用 但它非常慢。这个清单相当大。 当我尝试按照当前答案的建议链接Q时,它抛出了一个OperationalError(太

  • 问题内容: 我正在寻找一种在Oracle 9数据库中执行多行插入的好方法。以下内容在MySQL中有效,但Oracle似乎不支持以下内容。 问题答案: 这在Oracle中有效: 这里要记住的是使用语句。

  • 问题内容: 我正在使用最新版本的elasticsearch-php以及最新版本的MongoDB和ElasticSearch。 我需要对可以包含一个或多个值的多个字段进行搜索。例: country_code应为NL,BE或DE,并且类别应包含AA01,BB01,CC02或ZZ11 我以为我会按照以下方式解决它(PHP): 但是结果甚至还不能接近我期望返回的数据。 有时 $ countries 和/或

  • 本文向大家介绍在MySQL中搜索多列以进行行匹配,包括了在MySQL中搜索多列以进行行匹配的使用技巧和注意事项,需要的朋友参考一下 为此,请使用UNION。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是搜索多列的查询- 这将产生以下输出-

  • 我有一个二进制搜索树,它的每个节点都有两个值。 所以它的节点是这样的。 我已经根据节点的“name”变量的升序在BST中插入了值。所以树的顺序遍历将按“name”的升序返回节点。 现在我想根据“值”变量的升序显示树节点。无需更改原始树。哪种算法/方法对此最有效?