0

我正在开发一个使用 MySQL 作为其数据库的应用程序。但是,我正在添加一个使用 ElasticSearch 的带有自动完成/“按您输入的结果”的搜索功能。将相关数据从 MySQL 获取到 ElasticSearch 不是问题,我的搜索工作正常。

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

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

我应该查看其他任何可能的罪魁祸首/通常的嫌疑人吗?还是初始 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));
4

2 回答 2

1

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

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

  • 暂时禁用refresh
PUT /index/_settings
{
  "index": {
    "refresh_interval": "-1"
  }
}
  • 运行一次查询
  • 等几分钟
  • 第二次运行查询并比较结果
  • 测试后,您可以启用将 refresh_interval 设置回初始值。如果您没有在设置中更改它,那么它应该是1s(默认)。
于 2015-10-27T07:17:02.007 回答
0

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

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

谢谢。

于 2015-10-27T07:52:25.400 回答