我们有大数据集(大约 1.91 亿条记录,将会增长),每条记录都包含过滤器的值(11 个过滤器 - 日期时间和整数值),以及一些额外的数据(成本)。例如:
Depature City = 1
Arrival City = 5
Country Id = 7
Check In Date = 2013-05-05
... etc
Cost 1250
... etc
我们有一个包含 11 个过滤器的搜索界面。在每个过滤器中,用户可以选择:一个值、一组值、所有值。
每个过滤器都有不同的一组可能值,它可以从 4 到 5000 个值不等。
搜索结果必须按成本升序排列,有分页(每页50条结果)
每个搜索查询必须在 100 毫秒内完成,通常预计每秒 50-70 个请求(最多 200 个)。
数据会经常发生变化,但数据变化的速度具有较低的优先级,比搜索这个过程可能要慢。
组织此类搜索引擎的最佳方式是什么?内存中的数据(我们尝试了一些树算法)、Map-Reduce(Hadoop?)、OLAP?
更新。您如何看待一些内存解决方案?可以将记录加载到一些有利于搜索和排序结构的操作内存中。什么结构最好?
在生产环境中,客户将能够提供合适的硬件以获得良好的解决方案。
通常,我们有一个 .NET 解决方案 - 因此,此模块必须与其兼容。
最佳答案
[TrollModeOn] 我有一个问题....试图用非 sql 解决方案解决它,现在我有 2 个问题 [/TrollModeOff]。
在我看来,无 SQL 解决方案不适合处理如此多的过滤器内容。我将从基于 sql 的解决方案开始。例如。如果我们有 ms sql server,我们可以使用用户定义的表类型作为过滤器,例如:
CREATE TYPE [FilterTable] AS TABLE(
[id] [int] NOT NULL --or any datatype needed
)
之后您可以将表类型作为参数传递给过滤存储过程(或使用 sql 查询),例如:
CREATE PROCEDURE [SomeFilterProcedureName]
@Filter1 FilterTable READONLY,
@Filter2 FilterTable READONLY
....
你的查询是这样的:
SELECT
field1,
field2,
field3
FROM MyTable t
WHERE
(@Filter1 IS NULL OR t.field1 IN (SELECT id FROM @Filter1))
AND (@Filter2 IS NULL OR t.field2 IN (SELECT id FROM @Filter2))
....
ORDER BY
whatever
所以基本上你检查你的参数是否包含一些值,如果是 - 你根据过滤器参数数据过滤掉列值。
RDBMS 在存储、查找、过滤和排序大量数据方面做得非常出色,但您需要以正确的方式对其进行调整以使其运行更快,例如您需要正确设置索引。您也可以将数据缓存一段时间,但请确保根据不同的参数构建正确的缓存键。
如果您的数据库服务器不够好,无法每秒处理 200 个查询,您可能需要创建一个集群或保持多个具有相同数据的数据库服务器并使用某种数据库平衡器。
upd:太大了不能放在评论里
最坏的情况是他可以为每 11 个过滤器选择“全部”,我们必须对 1.92 亿条记录进行排序以找到成本最低的 20-100 条记录
全过滤器,成本最低?是不是和下面的一样:
按成本从 someTableName order 中选择 top(20) *
。
数据库锁
。更好地处理索引和查询排序
。好的,您有 1 亿条适合过滤器的记录。你打算如何对它们进行排序? QSort,MergeSort,BubbleSort?或者也许是 stackoverflowSort?你知道你必须选择哪种算法吗?但首先 - DBMS 知道,它会为案例选择最佳算法,因为它有统计数据,其次 - 当然数据是按顺序存储在索引中的。因此,每 100m 条记录排序操作都会杀死 no-sql 解决方案,但会在 rdbms 上完美运行高负载
。这不是我们在说的吗?在您的情况下,那里并不是真正的高负载。有些公司每月有 100-1.5 亿活跃用户,拥有海拉大数据库,每秒查询数以千计,是的,他们使用 rdbms。数十台服务器、分片、平衡,它运行完美。
关于.net - 组织搜索服务的最佳方式,可以根据过滤器集在大数据库中查找数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949442/