使用AzureSearch SDK与30-40 ISearchIndexClients的静态字典的含义
我有一个ASP.NET Web应用程序,它在5-6个搜索服务中使用30-40个不同的搜索索引(不同的客户端在不同的定价层中)。
目前,我正在编组一个新的ISearchServiceClient实例,然后根据发出调用的客户端为所需的特定索引提供相应的ISearchIndexClient 。
为了提高性能,我考虑在应用程序启动时整理所有ISearchIndexClients并将它们放入Dictionary对象:
public static Dictionary SearchIndexes;
这样就可以直接从静态字典中调用任何特定的索引并像这样使用:
SearchIndexes["IndexName"].Documents.Search(searchText, searchParameters);
我希望这会加快查询和索引更新时间,特别是在“热门”索引上。 我担心的是,这可能会引入内存泄漏,性能问题和其他未知因素。
我没有看到使用静态可用的SearchServiceClient或SearchIndexClient的任何示例,所以我对这种方法有点不安。 我对社区的问题是:
- 我的计划听起来不错?
- 它实际上会提高性能吗?
- 有什么缺点或影响(如果有的话?)
- 如果指数的数量随着时间的推移而增加(例如60-70),那么我会开始看到弊端吗?
-
将SearchServiceClients编组到字典中并根据需要从那里连接到相应的SearchIndexClient会更有意义:
public static Dictionary SearchServices; var searchIndexClient = SearchServices["ServiceName"].Indexes.GetClient("IndexName"); searchIndexClient.Documents.Search(searchText, searchParameters);
此策略可能无法扩展到所需的索引数。 最可能的结果是您将耗尽可用的TCP连接池。 更好的方法是实现由索引名称键入的SearchIndexClient
实例的缓存。 在高速缓存未命中时,您可以获得对最近最少使用的客户端的独占访问权,并在其上设置IndexName属性。 对于这种情况,可设置的属性被添加到SearchIndexClient
(请注意,它替换了已弃用的TargetDifferentIndex
方法)。
您可以在GitHub , MSDN论坛以及此相关的StackOverflow问题上找到有关共享SearchIndexClients
的含义的更多讨论和背景信息。