【问题标题】:elastic search queries slow first time弹性搜索查询第一次很慢
【发布时间】:2017-06-23 15:55:30
【问题描述】:

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

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

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

PD:弹性搜索 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()));
  }
}

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

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

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

    【讨论】:

    • 我一直遇到同样的问题。我正在使用 ninject 将 ElasticClient 和 ConnectionSettings 注册为单例。在我的 ninject 模块中运行第一个查询。但是,老是遇到同样的问题!
    • 你是如何注册他们的?您可以编辑并添加到您的问题吗?
    【解决方案2】:

    Elasticsearch 使用查询缓存来缓存查询结果 (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-cache.html)。第一次运行查询时,它会执行排序的“冷提取”并缓存结果,这就是您后续查询要快得多的原因。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 2019-12-12
    • 2012-03-27
    • 2021-07-23
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多