我正在寻找一些建议。我最近结束了一个项目,我继承了一些可怕的代码。我让应用程序运行但是可以肯定地说有许多性能和设计问题,特别是高级搜索功能。我现在被要求做一个非常相似的项目,但规模要大得多。我有机会从头开始构建一个更好的域模型,并创建一个更好的应用程序作为一个整体。问题是实现高级搜索的最佳方式是什么?
高级搜索页面会显示一个表单,其中包含两个必需的文本字段,4个可选的下拉列表和两个带有多个可选复选框的独立区域,以进一步过滤结果。
当前解决方案使用两个必填字段返回一个对象列表,然后根据任何可选的表单值过滤和消除这些对象。然后我将过滤后的List放入缓存并附加用户的会话ID。然后在每个结果页面上,我有一个Html.Helper,它显示使用从缓存中检索到的List上的Take()。Skip()方法的分页链接,以显示10个结果。
我遇到的问题是列表可以变得非常强大。我试图通过将结果放入缓存中来保存每个新结果页面的数据库调用,但我不确定这是否是解决此问题的最佳方法。我应该将所有表单值放在怪物查询字符串中并继续从GET请求中进行数据库调用吗?我应该在数据库或会话中保存用户搜索条件,并将其用于每个新的结果页面吗?我是否正确使用缓存来保存这样一个强大的集合?
我在这里问了一个类似的问题:Paging search results with asp.net MVC导致我使用缓存。现在我有一个干净的名单,我很乐意遵循最佳实践并从一开始就做好。任何建议都会很棒。
答案 0 :(得分:1)
显然,实施高级搜索的最佳方式取决于您的要求以及您目前对搜索空间大小和搜索频率的估算。我的猜测是,您最大的问题是是否将搜索作为ORM的一部分或在关系数据库中实现。
大型SQL查询可能非常慢,难以调整,也很难调试。如果高级搜索是一项主要功能并且具有许多复杂的业务规则,那么请考虑将搜索作为ORM的一部分进行实施。此外,智能搜索将有利于使用ORM。
将大量大型对象加载到内存中会对性能和可伸缩性产生影响。如果搜索空间很大,则考虑使用SQL进行搜索。
有可用于分布式搜索的算法,但它们非常复杂,您的预算,专业知识和交付时间表可能无法适应这种方法。先进的搜索对项目的成功有多大的战略意义?
搜索必须是实时的吗?如果没有,那么考虑一种混合方法,其中对象在非高峰时间被索引。必须搜索诸如“the”或“因为”之类的低相关性词语是浪费的,因此搜索对象的释义版本可能会带来愉快的媒介。
祝你好运,玩得开心!