Sitecore - 重用应用程序范围的索引搜索器

时间:2013-10-08 08:05:23

标签: sitecore lucene.net sitecore6

Sitecore.NET 6.6.0(rev.130404)

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

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

我还读到,IndexSearchContext对创建IndexSearchContext后创建的索引更新不敏感。因此,我正在处理共享的IndexSearchContext并每30秒创建一个新的,这样查询就会得到最新的结果,只有30秒的延迟。这种方法要求我仔细处理创建的线程安全并处理共享索引搜索器。

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

感谢

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

总而言之,它听起来有点像premature optimization。但是我不知道你的完整设置,我可能错了。

答案 2 :(得分:1)

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