2

Sitecore.NET 6.6.0(修订版 130404)

在我们的项目中,我们使用 Sitecore.Search.IndexSearchContext 来执行我们所有的查询。具体来说,我们使用 IndexSearchContext.Searcher 方法来访问内部 Lucene 搜索器并将 Lucene 查询传递给它。

我发现(通过网络文章和实验)如果我们重用同一个 IndexSearchContext 实例来执行我​​们所有的查询,它比为每个执行的查询创建和销毁 IndexSearchContext 快得多。

我还读到 IndexSearchContext 对创建 IndexSearchContext 后进行的索引更新不敏感。正因为如此,我正在处理共享的 IndexSearchContext 并每 30 秒创建一个新的,以便查询只需 30 秒延迟即可获得最新结果。这种方法要求我仔细处理创建和处置共享索引搜索器的线程安全性。

这是一种安全的做事方法吗?是否不鼓励在 sitecore 中重用应用程序范围的索引搜索器?

谢谢

4

3 回答 3

3

我建议您连接到“publish:end”和“publish:end:remote”(在多服务器环境中),并在这些事件触发时删除您的 IndexSearchContext。最终,您处于 Sitecore 环境中,并且只有在发布新内容时,您的索引才会过时。诚然,这个版本的事实有点简化,因为我不知道您正在运行的应用程序的全部范围。

于 2013-10-08T08:32:05.673 回答
3

老实说,我没有看到产生许多 IndexSearchContext 的任何性能问题。除非您极端使用它并且需要一个极其优化的环境,否则我建议您不要使用它。我已经看到了很多锁定索引的问题,你也可能会遇到一些 HTML 缓存问题(如果使用的话)。

总而言之,这听起来有点像过早的优化。但是我不知道你的完整设置,我可能是错的。

于 2013-10-08T22:28:01.893 回答
1

我已经尝试过这种方法并且可以确认它有效。我每 10 秒重新创建一次索引搜索器,这大大提高了可以处理的并发请求的数量。但是,Sitecore 的 IndexSearchContext 不能像这样共享(它旨在在单个线程中创建和销毁)。我所做的是实例化一个原始的 Lucene IndexSearcher 并在整个应用程序中共享它。

于 2013-10-24T12:14:09.177 回答