Mat*_*ias 8 c# asp.net search search-engine
我一直在实施MS Search Server 2010,到目前为止它非常好.我通过他们的网络服务进行搜索查询,但由于结果不一致,我正在考虑缓存结果.
该网站是一个小型内部网(500名员工),所以它不应该是任何问题,但我很好奇如果它是一个更大的网站你会采取什么方法.
我已经google了abit,但还没有真正解决任何具体问题.那么,有几个问题:
欢迎任何输入:)
您需要采用多种技术才能成功实现这一目标。
首先,您需要某种持久层。如果您使用的是普通的旧网站,那么用户会话将是最合乎逻辑的使用层。如果您正在使用 Web 服务(即无会话)并且只是通过客户端进行调用,那么您的服务仍然需要某种应用程序层(某种共享会话)。为什么?该层将成为数据库结果缓存的所在地。
其次,您需要一种在您使用的任何容器(会话或 Web 服务的应用程序层)中缓存结果的方法。您可以通过多种方式执行此操作...如果查询是任何用户都可以执行的操作,则查询的简单散列将起作用,并且您可以在其他用户之间共享此存储的结果。您可能仍然需要某种 GUID 作为结果,以便您可以在客户端应用程序中传递它,但是从查询到结果进行哈希查找将很有用。如果这些查询是唯一的,那么您只需使用查询结果的唯一 GUID 并将其传递给客户端应用程序即可。这样您就可以执行缓存功能......
缓存机制可以合并某种固定长度的缓冲区或队列...以便在添加新结果时旧结果将自动被清除/删除。然后,如果传入的查询是缓存未命中,它将正常执行并添加到缓存中。
第三,您将需要某种方法来对结果对象进行分页...迭代器模式在这里运行良好,尽管可能更简单的方法可能会起作用...例如从点Y开始获取X数量的结果。但是,迭代器模式会更好,因为您可以稍后删除缓存机制,并根据需要直接从数据库中进行分页。
第四,您需要某种预取机制(正如其他人建议的那样)。您应该启动一个线程来执行完整搜索,并在主线程中仅对前X个项目进行快速搜索。希望当用户尝试分页时,第二个线程将完成,并且您的完整结果现在将在缓存中。如果结果尚未准备好,您可以合并一些简单的加载屏幕逻辑。
这应该可以帮助您......如果您需要有关任何特定部分的澄清/更多详细信息,请告诉我。
我会给你一些更多的建议......
您不想将整个结果发送到客户端应用程序(如果您使用的是 Ajax 或类似 iPhone 应用程序的东西)。为什么?好吧,因为这是一种巨大的浪费。用户可能不会翻阅所有结果...现在您只是免费发送了超过 2MB 的结果字段。
Javascript 是一种很棒的语言,但请记住它仍然是一种客户端脚本语言...您不希望通过发送大量数据供 Ajax 客户端处理来过多地降低用户体验。只需将预取结果发送给您的客户端,并将其他页面结果作为用户页面发送即可。
抽象 抽象 抽象...您想要抽象出缓存、查询、分页、预取...尽可能多的内容。为什么?好吧,假设您想切换数据库,或者您想直接从数据库进行分页,而不是使用缓存中的结果对象……如果您做得正确,以后更改会更容易。此外,如果使用 Web 服务,许多其他应用程序稍后可以使用此逻辑。
现在,我可能建议了一个针对您需要的过度设计的解决方案:)。但是,如果您可以使用所有正确的技术来实现这一目标,那么您将学到很多东西,并为您想要扩展功能或重用此代码奠定良好的基础。
如果您有疑问,请告诉我。