问题描述
如果我的搜索引擎数据库有很多记录(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
那可能很慢吧? (例如,如果我们从搜索结果中获得1万个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
但是与此同时,我们还必须在search_results
表中插入大量ID
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','id2156','id5126'});
-- then the query above would be:
-- WHERE id = ANY(SELECT ids FROM search_results WHERE search_id = ?)
问题:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)