php - 操作方法 : Ranking Search Results

标签 php mysql search

我有一个 webapp 开发问题,我已经为其开发了一个解决方案,但我正在尝试寻找可能解决我所看到的一些性能问题的其他想法。

问题陈述:

  • 用户输入多个关键字/ token
  • 应用程序搜索 token 的匹配项
  • 每个标记需要一个结果
    • 即,如果一个条目有 3 个标记,我需要 3 次条目 ID
  • 对结果进行排名
    • 为 token 匹配分配 X 分
    • 根据分数对条目 ID 进行排序
    • 如果点值相同,则使用日期对结果进行排序

我想做的,但还没有弄清楚,是发送 1 个返回类似于 in() 结果的查询,但是为每个条目 ID 的每个标记匹配返回一个重复的条目 ID检查。

有没有比我正在做的更好的方法来做到这一点,即使用多个单独的查询,每个 token 运行一个查询?如果是这样,实现这些的最简单方法是什么?

编辑
我已经标记了条目,因此,例如,“see spot run”的条目 ID 为 1,三个标记“see”、“spot”、“run”,它们位于单独的标记表中,具有与它们相关的条目 ID,因此表格可能如下所示:

'see', 1 
'spot', 1 
'run', 1 
'run', 2 
'spot', 3 

最佳答案

您可以在 MySQL 中使用“UNION ALL”在一个查询中实现这一点。

只需遍历 PHP 中的标记,为每个标记创建一个 UNION ALL:

例如,如果标记是“x”、“y”和“z”,您的查询可能看起来像这样

SELECT * FROM `entries` 
WHERE token like "%x%" union all 
    SELECT * FROM `entries` 
    WHERE token like "%y%" union all 
        SELECT * FROM `entries` 
        WHERE token like "%z%" ORDER BY score ect...

order 子句应该对整个结果集作为一个整体进行操作,这正是您所需要的。

就性能而言,它不会那么快(我猜),但是对于数据库来说,速度方面的主要开销通常是从 PHP 向数据库引擎发送查询并接收结果。使用这种技术,这只会发生一次,而不是每个 token 一次,因此性能会提高,我只是不知道它是否足够。

关于php - 操作方法 : Ranking Search Results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47762/

相关文章:

php - getElementById 总是返回第一个对象,我如何获取其他值?

javascript - PHP/JS Ajax _POST 数组未发布

php - INSERT 到 MYSQL 中,然后在关闭连接之前选择插入 id,然后将此 id 添加到其他 3 个表中

MySQL每个用户的第二个最大值

android - 在 Android 中动态填充对象的 ListView

php - 加入 4 个表并检索数据

javascript - 我想在提交后加载 php 一条消息以隐藏表单,但 event.preventDefault();破坏了对我的 .php 文件的 "already exists"检查

php - 带参数的 Doctrine2 DQL TRIM

sql-server-2008 - 如果用户输入 "ABCD-EFGH"而不是 "ABCDEFGH",SQL 查询将返回结果

search - 在 Web 项目中使用 SOLR 的最佳方法是什么?