代码之家  ›  专栏  ›  技术社区  ›  DM.

大型物体的高级搜索设计

  •  2
  • DM.  · 技术社区  · 15 年前

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

    高级搜索页面会显示一个包含两个必需文本字段、4个可选下拉列表和两个带有多个可选复选框的单独区域的表单,以便进一步筛选结果。

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

    我现在面临的问题是,这个列表会变得相当强大。我试图通过将结果的每个新页面放入缓存来保存数据库调用,但我不确定这是否是最好的方法。我应该把所有表单值都放在一个怪物查询字符串中,并不断地从GET请求中进行数据库调用吗?我应该将用户搜索条件保存在数据库或会话中,并将其用于每个新的结果页吗?我用缓存来保存这样一个结实的收藏对吗?

    我在这里问了一个类似的问题: Paging search results with asp.net MVC 这导致我使用了缓存。现在,我已经有了一个干净的石板,我希望遵循最佳实践,并从一开始就做好它。任何建议都很好。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Glenn    15 年前

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

    大型SQL查询速度可能非常慢、难以优化和调试困难。如果高级搜索是一个主要功能,并且有许多复杂的业务规则,那么考虑将搜索实现为ORM的一部分。此外,智能搜索将有利于使用ORM。

    将大量大型对象加载到内存中会对性能和可伸缩性造成损失。如果搜索空间很大,那么考虑使用SQL进行搜索。

    有一些算法可用于分布式搜索,但它们非常复杂,您的预算、专业知识和交付时间表可能不适合这种方法。高级搜索对项目的成功有何战略意义?

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

    祝你好运,玩得开心!