弹性搜索查询第一次缓慢

时间:2017-06-23 15:55:30

标签: c# elasticsearch nest

在工作中,我设置了一个开发环境,我们正在测试我们的电子商务网站的弹性搜索。我注意到查询运行速度非常快(与sql server相比)。但是,第一次执行查询时,最终在目录中呈现产品需要相当长的时间。初步查询后,一切都开始很快。

如果我离开网站并在同样的事情发生后重新进入一段时间。

顺便说一句,我们的应用程序正在使用NEST(高级c#客户端),显然对于第一个查询,它需要执行一些延迟搜索的操作。 反正有没有阻止这个?我可以配置NEST在应用程序启动时执行此操作吗?

PD:elasticsearch 5.4

更新:

这就是我在NinjectModule中初始化ElasticClient和ConnectionSettings的方式:

public class ElasticRepositoryInjection : NinjectModule
{
  public override void Load()
  {
     var connectionPool = new SingleNodeConnectionPool(new Uri(ConfigurationManager.AppSettings["elastic.server"]));
     var elasticSearchConnectionSettings = new ConnectionSettings(connectionPool)
        .DefaultIndex("isolution")
        .EnableTcpKeepAlive(TimeSpan.FromMilliseconds(2000), TimeSpan.FromMilliseconds(2000))
        .DisableDirectStreaming();

     Bind<ConnectionSettings>().ToConstant(elasticSearchConnectionSettings).InSingletonScope();

     var client = new ElasticClient((Kernel as StandardKernel).Get<ConnectionSettings>());
     Bind<ElasticClient>().ToConstant(client).InSingletonScope();

     client.Search<Domain.Isolution.ElasticSearch.Product>(s => s
        .Query(q => q.MatchAll()));
  }
}

2 个答案:

答案 0 :(得分:1)

NEST内部使用缓存,例如成员访问lambda表达式到字符串,键入JsonContract等,这将建立在第一个请求上。

预先在NEST中没有任何内容来执行此启动,它故意是一个懒惰的操作。但是,在应用程序启动时,您可以初始化a singleton instance of IElasticClient,向Elasticsearch发出搜索请求以填充缓存,然后将客户端实例提供给需要它的组件。启动缓存是以任何一种方式执行的,但这种方式至少第一次用户调用不会等待它。

答案 1 :(得分:0)

Elasticsearch使用查询缓存来缓存查询结果(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-cache.html)。第一次运行查询时,它正在执行&#34;冷获取&#34;排序和缓存结果,这就是为什么后续查询要快得多。

如果您的第一个查询执行速度慢得多,取决于您尝试撤回的数据量,请考虑使用滚动(https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html)来提高性能。