database - 结合搜索引擎和数据库
问题描述
如果我的搜索引擎数据库有很多记录(id 和与该 id 关联的关键字),当给定输入(关键字列表)时,将输出 id 列表和排名
database:
id1 keyword1 keyword2 ... keyword9
id2 keyword4 keyword7 ... keyword10
id3 keyword5 keyword6 ... keyword12
...
id99999 keyword15 keyword6 ... keyword19
input:
keyword8 keyword9
output:
id1 0.994
id2125 0.841
...
id84512 0.342
然后将其显示给用户,我们将执行如下查询:
SELECT *
FROM products
WHERE id IN ('id1','id2125',...,'id5127')
-- ^ only need to bind first 20 ids
-- from search engine result
-- and 21st to 40th ids for next page
-- and so on
但是当用户选择按最低价格排序时,我们必须这样做:
SELECT *
FROM products
WHERE id IN (/* a very very long list */)
-- ^ all the ids from search engine result
ORDER BY current_price
LIMIT 20 OFFSET 0
那可能很慢吧?(如果我们从搜索结果中获得例如 10k 个 ID,则无法扩展)。
我们可以通过插入另一个表(例如search_results
表)然后进行WHERE IN (SELECT)
查询来减少参数绑定长度/传递/传输(因此使用相同的关键字搜索或下一页会更快):
SELECT *
FROM products
WHERE id IN (SELECT id FROM search_results WHERE search_id = ?)
ORDER BY current_price
LIMIT 20 OFFSET 0
但是有了这个,我们还必须将大量的 id 插入到search_results
表中
INSERT INTO search_results(search_id,id) VALUES(...,'id1'),(...,'id2125'),(...,'id2156'),... -- and so on
-- or in PostgreSQL which support array data type
INSERT INTO search_results(search_id,ids) VALUES(...,{'id1','id2125','id2156',...,'id5126'});
-- then the query above would be:
-- WHERE id = ANY(SELECT ids FROM search_results WHERE search_id = ?)
问题:
- 如果有的话,有什么更好的方法来做到这一点?
- 亚马逊或任何其他在线商店的人们如何处理这种情况(他们使用什么搜索引擎和/或数据库组合)或完全使用其他东西?
解决方案
推荐阅读
- mysql - 为什么phpmyadmin和mysql docker容器之间的连接不起作用
- sql-server - 从 SQL Server 2016 SP1 中的 QueryStore 获取报表服务器查询
- php - 不正确的条件导致 php [已解决]
- php - 将数据存储在 localStorage 并保存在数据库中
- php - 基于 WooCommerce 中购物车商品数量的额外价格
- android - 如何在 androidx.recyclerview.widget 中使用 androidx.recyclerview.selection。或者如何在 android 中使用 kotlin 在 recyclerview 中选择一个项目?
- php - WooCommerce get_attributes 仅返回一个属性的值
- kubernetes - 获取所有 Pod 的当前和最新的 CPU 和内存使用情况
- android - 如何在 recyclerView Android Studio 的自定义线性布局中自定义单个元素的方向?
- html - 在 HTML 中绘制带有孔列表的 svg 多边形