.net 组织搜索服务的最佳方式,它可以根据过滤器集在大型数据库中查找数据

.net 组织搜索服务的最佳方式,它可以根据过滤器集在大型数据库中查找数据,.net,algorithm,search,tree,olap,.net,Algorithm,Search,Tree,Olap,我们有一个大的数据集(大约1.91亿条记录,将会增加),每条记录都包含过滤器的值(11个过滤器-日期时间和整数值),以及一些额外的数据(成本)。例如: Depature City = 1 Arrival City = 5 Country Id = 7 Check In Date = 2013-05-05 ... etc Cost 1250 ... etc 我们有一个带有11个过滤器的搜索界面。在每个过滤器中,用户可以选择:一个值、一组值、所有值 每个过滤器都有不同的可能值集,

我们有一个大的数据集(大约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个)

数据会经常更改,但数据更改的速度优先级较低,搜索此过程可能会比较慢

组织这样的搜索引擎的最佳方式是什么?内存中的数据(我们尝试了一些树算法)、MapReduce(Hadoop?)和OLAP

更新。你认为一些内存解决方案怎么样?这些记录可以加载到操作内存中,以便于搜索和排序。什么结构最好

在生产环境中,客户将能够为良好的解决方案提供适当的硬件


一般来说,我们有一个.NET解决方案-因此,此模块必须与之兼容。

我认为
HBase
我们适合您的要求,并且对于.NET兼容性,
hadoop
。NET
sdk可从
霍顿
获得:有关详细信息,我有一个问题。。。。试图在没有sql解决方案的情况下解决它,现在我有两个问题[/TrollModeOff]

在我看来,没有sql解决方案不适合处理这么多过滤器的东西。我将从基于sql的解决方案开始。例如,如果我们有ms sql server,我们可以使用用户定义的表类型进行筛选,例如:

CREATE TYPE [FilterTable] AS TABLE(
    [id] [int] NOT NULL   --or any datatype needed
)
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
之后,您可以将表类型作为参数传递给筛选存储过程(或使用sql查询),如:

您的查询可能是:

CREATE TYPE [FilterTable] AS TABLE(
    [id] [int] NOT NULL   --or any datatype needed
)
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在存储、查找、过滤和排序大量数据方面做得非常出色,但您需要以正确的方式对其进行调整,使其工作更快,例如,您需要正确设置索引。您还可以将数据缓存一段时间,但请确保根据不同的参数生成正确的缓存密钥

如果您的db服务器不够好,无法每秒处理200个查询,那么您可能需要创建一个集群,或者让几个具有相同数据的db服务器保持运行,并使用某种db平衡器

upd:它太大,无法放在评论中

最糟糕的情况是,他可以为每11个过滤器选择“全部”,我们必须对1.92亿条记录进行排序,以找到成本最低的20-100条记录

所有过滤器,成本最低?这不就是:
从someTableName中选择top(20)*按成本排序

  • Db锁
    。更好地处理索引和查询
  • 排序
    。好吧,你有1亿张符合过滤条件的记录。你打算如何对它们进行分类?QSort,MergeSort,BubbleSort?或者是stackoverflowSort?你知道你必须选择哪种算法吗?但首先,DBMS知道,它会根据情况选择最好的算法,因为它有统计信息,其次,当然,数据是按索引的顺序存储的。因此,每执行一次100m记录排序操作都不会杀死任何sql解决方案,但在rdbms上可以完美地工作
  • 高负载
    。这不是我们正在谈论的吗?在你的情况下,这不是真正的高负荷。有些公司每月有1-1.5亿活跃用户,拥有hella大型数据库,每秒有上千个查询,是的,他们使用rdbms。数十台服务器,分片,平衡,工作完美
  • 这正是SQL设计的场景 现代系统上的SQL Server(例如,具有8 GB RAM的四核CPU)可以在您需要的时间范围内轻松处理所有筛选器,或者根本不处理筛选器,前提是您为要筛选的每个字段创建索引

    您可以使用Sergio的存储过程来实现过滤器;但这是可能的。直接在C#(或VB.NET)中生成正确的SQL语句同样容易

    轮廓,轮廓,轮廓
    在寻找Map Reduce或其他(b)前沿技术之前,请尝试SQL。创建表和索引大约需要15分钟,您可以对查询计时。如果它接近您的需求,那么您可以开始编写代码,根据过滤器生成正确的SQL选择。如果SQL查询比您的要求慢,您可以决定是要对其进行优化,还是去别处看看但在完成概要分析之前,绝对没有理由尝试任何其他方法。

    内存解决方案可能是可行的。由于您需要存储12个值x 200M记录,因此需要大约20GB的RAM网络(假设每个值8个字节)。您需要进行优化(尽可能存储1/2/4字节的值,并禁用内存对齐)。实际上,您可能需要一台64GB或更强大的机器

    一种认为您负担不起的方法是使用需要大量小内存分配的数据结构。即使将数据存储在一个巨大的缓冲区中,也可能需要为树结构索引分配许多小的分配

    树对您的问题不太合适还有另一个原因:因为用户可能会为每个过滤器选择一组值,所以您需要遍历树以搜索任何组合。这可能是大量的树遍历

    一个更简单的解决方案怎么样?选择将数据集划分为最大组数的2个过滤器(这可能是具有~5000个值的过滤器)。使用二维阵列。在每个单元格中,如果它不是空的,则存储一个包含所有剩余结构的数组