C# 存储搜索结果以进行分页和排序

C# 存储搜索结果以进行分页和排序,c#,asp.net,search,search-engine,C#,Asp.net,Search,Search Engine,我一直在实施MS Search Server 2010,到目前为止,它真的很好。我通过他们的web服务进行搜索查询,但由于不一致,我考虑缓存结果 这个网站是一个小型内联网(500名员工),所以应该不会有任何问题,但我很好奇如果它是一个更大的网站,你会采取什么方法 我在谷歌上搜索了一下,但还没有找到任何具体的信息。因此,有几个问题: 还有什么其他方法?为什么它们更好 存储400-500行的dataview需要多少钱?什么尺寸是可行的 您应该考虑的其他要点 欢迎任何输入:)我必须承认我对MS S

我一直在实施MS Search Server 2010,到目前为止,它真的很好。我通过他们的web服务进行搜索查询,但由于不一致,我考虑缓存结果

这个网站是一个小型内联网(500名员工),所以应该不会有任何问题,但我很好奇如果它是一个更大的网站,你会采取什么方法

我在谷歌上搜索了一下,但还没有找到任何具体的信息。因此,有几个问题:

  • 还有什么其他方法?为什么它们更好
  • 存储400-500行的dataview需要多少钱?什么尺寸是可行的
  • 您应该考虑的其他要点

欢迎任何输入:)

我必须承认我对MS Search Server不是很熟悉,所以这可能不适用。我经常遇到这样的情况:应用程序必须在数亿条记录中搜索结果集,这些结果集需要在SQL Server中进行排序、分页和子搜索。一般来说,我所做的是采取两步走的方法。首先,我抓取需要显示的第一个“x”结果,并将其发送到浏览器进行快速显示。其次,在另一个线程上,我完成了完整的查询,并将结果移动到一个临时表中,在那里可以更快地存储和检索结果。任何给定的查询可能有数千或数万个结果,但与数亿甚至数十亿条记录相比,这个较小的子集可以很容易地从临时表中进行操作。当查询发生时,它也会减少对其他表的压力。如果用户需要第二页记录,或者需要对它们进行排序,或者只需要原始查询的一个子集,那么这些都是从临时表中提取的

然后需要将逻辑设置到位,以检查过时的临时表并将其删除。这很简单,我让SQL Server处理该功能。最后,当原始查询发生变化(显著的周长变化)时,必须将逻辑设置到位,以便可以将新的数据集拉入新的临时表中进行进一步查询。所有这些都相对简单

用户已经习惯于从谷歌这样的地方分秒返回,这种模式给了我足够的灵活性,可以在不需要他们使用的专用软件和硬件的情况下实现这一点


希望这有点帮助。

如果您能够在第二个线程中运行初始查询,并且应用于结果的逻辑(分页/排序/筛选)需要在服务器上执行操作,那么Tim的答案是处理问题的一个很好的方法。。。。。否则

如果可以使用AJAX,则可以在页面中调用500行结果集,并在客户端上分页或排序。这会带来一些非常有趣的功能。。。。查看来自jQueryUI和Dojo的datagrid解决方案,获得灵感

对于真正密集的功能,如任意正则表达式过滤器和拖放列重新排序,您可以完全释放服务器

同时将数据加载到浏览器还可以在用户“请求”支持数据时调用支持数据(页面预览等)

主要问题是将每个结果返回的数据限制为实际用于排序和筛选的数据


可能性是无穷的:)

听起来搜索的缓慢部分是全文搜索,而不是结果检索。如何缓存生成的资源记录ID?另外,由于搜索查询通常是重复的,所以存储搜索查询、查询和匹配资源的散列。然后您可以通过ID检索下一页的结果。也可以使用AJAX


由于它是一个内部网,您可以控制搜索到的资源,因此您甚至可以在空闲时间预先计算新的或更新的资源与流行查询的匹配。

您需要采用多种技术才能成功实现这一点

首先,您需要某种持久层。如果您使用的是一个普通的旧网站,那么用户的会话将是最合理的使用层。如果您正在使用web服务(意味着无会话),并且只是通过客户端进行调用,那么您仍然需要某种应用程序层(某种共享会话)来提供服务。为什么?该层将是数据库结果缓存的所在地

其次,您需要一种将结果缓存在您使用的任何容器(会话或web服务的应用层)中的方法。你可以用两种方法来做这件事。。。如果查询是任何用户都可以做的,那么查询的简单散列就可以了,您可以在其他用户之间共享这个存储的结果。您可能仍然需要某种类型的结果GUID,以便可以在客户端应用程序中传递它,但是从查询到结果进行哈希查找将非常有用。如果这些查询是唯一的,那么您可以对查询结果使用唯一的GUID,并将其传递给客户端应用程序。这样您就可以执行缓存功能

缓存机制可以包含某种固定长度的缓冲区或队列。。。以便在添加新结果时自动清除/删除旧结果。然后,如果传入一个缓存未命中的查询,它将正常执行并添加到缓存中

第三个,您需要某种方式来分页结果对象。。。迭代器模式在这里工作得很好,不过可能需要一些更简单的方法。。。像fetchX一样,从点Y开始的结果量。不过,迭代器模式会更好,因为您可以在以后删除缓存机制,并在需要时直接从数据库中分页

第四,您需要某种预取机制(如其他人所建议的)。你应该启动一个线程来完成这个任务