我有一个 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/