Asp.net mvc 大型对象的高级搜索设计

Asp.net mvc 大型对象的高级搜索设计,asp.net-mvc,linq-to-sql,design-patterns,search,Asp.net Mvc,Linq To Sql,Design Patterns,Search,我在寻求一些建议。我最近完成了一个项目,继承了一些糟糕的代码。我让应用程序运行了,但可以肯定地说,存在许多性能和设计问题,特别是高级搜索功能。我现在被要求做一个非常类似的项目,但规模要大得多。我在这里有机会从头开始构建一个更好的领域模型,并从整体上创建一个更好的应用程序。问题是实施高级搜索的最佳方式是什么 “高级搜索”页面将显示一个表单,其中包含两个必需的文本字段、4个可选下拉列表和两个单独的区域以及多个可选复选框,以进一步过滤结果 当前的解决方案使用两个必填字段返回一个对象列表,然后根据任何可

我在寻求一些建议。我最近完成了一个项目,继承了一些糟糕的代码。我让应用程序运行了,但可以肯定地说,存在许多性能和设计问题,特别是高级搜索功能。我现在被要求做一个非常类似的项目,但规模要大得多。我在这里有机会从头开始构建一个更好的领域模型,并从整体上创建一个更好的应用程序。问题是实施高级搜索的最佳方式是什么

“高级搜索”页面将显示一个表单,其中包含两个必需的文本字段、4个可选下拉列表和两个单独的区域以及多个可选复选框,以进一步过滤结果

当前的解决方案使用两个必填字段返回一个对象列表,然后根据任何可选的表单值过滤和删除这些对象。然后,我将过滤后的列表放入缓存,并附加用户的会话id。然后在每个结果页面上,我都有一个Html.Helper,它在从缓存检索的列表上显示使用Take().Skip()方法的分页链接,以显示10个结果

我面临的问题是,这份名单可能会变得相当有力。我试图通过将每个新的结果页面放入缓存来保存数据库调用,但我不确定这是否是最好的方法。我是否应该将所有表单值放在一个monster查询字符串中,并继续从GET请求进行数据库调用?我是否应该将用户搜索条件保存在数据库或会话中,并将其用于每个新的结果页面?我使用缓存来保存这样一个强大的集合对吗


我在这里问了一个类似的问题:这导致我使用缓存。现在我有了一张干净的名单,我希望遵循最佳实践,从一开始就做好。任何建议都很好。

显然,实施高级搜索的最佳方式取决于您的需求以及您当前对搜索空间大小和搜索频率的估计。我的猜测是,您最大的问题是是否将搜索作为ORM的一部分或在关系数据库中实现

大型SQL查询可能会非常慢,难以调优,并且难以调试。如果高级搜索是一个主要的特性并且有很多复杂的业务规则,那么考虑将搜索作为ORM的一部分。此外,智能搜索将有利于使用ORM

将大量大型对象加载到内存中会影响性能和可伸缩性。如果搜索空间很大,那么考虑使用SQL进行搜索。p> 有一些算法可用于分布式搜索,但它们非常复杂,您的预算、专业知识和交付计划可能无法适应这种方法。高级搜索对项目的成功有多大的战略意义

搜索必须是实时的吗?如果不是,那么考虑一种混合方法,其中对象在非高峰时间索引。必须通过“the”或“because”等低相关性词语进行搜索是浪费的,因此,通过对对象的释义版本进行搜索可能会找到一个令人满意的媒介


祝你好运,玩得开心

谢谢你的想法。高级搜索部分是最重要和最常用的功能,因此对整个项目来说非常具有战略性。您非常强调让SQL和ORM进行搜索和筛选。。。那么,我的设计是返回满足两个必填字段值的所有对象,然后根据可选表单值在C代码中过滤该列表,这是一种糟糕的做法吗?听起来你想在数据层进行一些过滤,在web层进行一些过滤。是这样吗?这可能是一个好办法。听起来这并不是一个很大的开发工作。你为什么不采用那种方法呢?如果以后遇到问题,您可以用其他代码替换该代码。试着将代码模块化,这样插入另一个代码就很容易了。好的建议。至于为这些搜索结果创建分页系统,您是否建议将所有表单值放入monster查询字符串中,并对每个分页请求执行数据库调用和筛选,还是我的缓存系统是最佳做法?建议与以前基本相同。使用缓存方法,因为代码承诺是最小的,但如果您开始遇到可伸缩性问题,请准备替换该代码。此外,您缓存的内容不会比网格显示的内容多得多,对吗?是的,我目前正在缓存显示结果所需的最低限度的信息,但列表中每个对象的一部分是缩略图的字节[]数组。因此,如果用户的搜索条件返回100多个结果,那么集合在缓存中会变得非常强大。思想?