“第一次”搜索查询的响应时间长的原因?

时间:2015-10-26 14:54:07

标签: c# elasticsearch nest elasticsearch-net

我正在开发一个使用MySQL作为数据库的应用程序。然而,我添加了一个搜索功能,其中包含使用ElasticSearch的autocomplete /“as-you-type results”。从MySQL获取相关数据到ElasticSearch不是问题,我的搜索工作正常。

但是我确实有som性能问题,但只有在进行“第一次”搜索查询时才需要大约1-5秒。 “第一”是指在几分钟内进行的第一次搜索;在第一次搜索接近即时结果后的10秒内进行第二次搜索,而在第一次搜索后五分钟进行第二次搜索仅在显着延迟后获得结果。

我最初的想法是,设置HTTP连接(由.NET Framework汇集)导致了额外的延迟,但似乎奇怪的是,即使不使用DNS,在快速LAN网络上需要1-5秒用于解析ElasticSearch服务器的名称。

我应该关注其他可能的罪魁祸首/通常的嫌疑人吗?或者初始HTTP连接延迟似乎是合理的(我会怎么做?)?

搜索是这样完成的(请注意,ElasticSearch / NEST客户端作为单例管理并且已经创建):

public IEnumerable<Person> Search(ElasticClient esclient, IEnumerable<string> queryParts, int groupId) {
    // Make the search query and return the results.
    return esclient.Search<Person>(s => s
        .Query(q =>
            q.Terms(p => p.FirstName, queryParts) ||
            q.Terms(p => p.LastName, queryParts)
        )
        .Filter(f => f
            .Term(p => p.MemberOfGroups, new int[] { groupId })
        )
    ).Documents;
}

编辑:我的ElasticClient是这样创建的:

new ElasticClient(new ConnectionSettings(new Uri(esUrl), index));

2 个答案:

答案 0 :(得分:0)

最有可能的是,这是Elasticsearch中发生的缓存。第一个查询将缓存过滤器的结果,后续调用将使用缓存的结果,而不是再次运行查询。如果在此期间更新索引,则缓存无效,因为数据已更改。

您可以通过以下方式测试此假设:

  • 暂时停用refresh
PUT /index/_settings
{
  "index": {
    "refresh_interval": "-1"
  }
}
  • 运行一次查询
  • 等一下几分钟
  • 第二次运行查询并比较结果
  • 在测试之后,您可以启用将refresh_interval设置为初始值。如果您未在设置中更改它,则它应为1s(默认值)。

答案 1 :(得分:0)

你可以在这里检查或发布你的弹性搜索集群的日志。它应该在你的$ log_directory /中。如果你为日志设置了tarce级别,那么这将更详细地了解集群内部发生的事情。

如果缓存是第一次查询的问题,您可以利用弹性搜索加热器在部署后加热群集缓存,或者编写调度程序以每天运行两次或三次加热。

感谢。