首页 > 解决方案 > 结合搜索引擎和数据库

问题描述

如果我的搜索引擎数据库有很多记录(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 = ?)

问题:

  1. 如果有的话,有什么更好的方法来做到这一点?
  2. 亚马逊或任何其他在线商店的人们如何处理这种情况(他们使用什么搜索引擎和/或数据库组合)或完全使用其他东西?

标签: databasesearch-engine

解决方案


推荐阅读