我正在开发一个使用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));
答案 0 :(得分:0)
最有可能的是,这是Elasticsearch中发生的缓存。第一个查询将缓存过滤器的结果,后续调用将使用缓存的结果,而不是再次运行查询。如果在此期间更新索引,则缓存无效,因为数据已更改。
您可以通过以下方式测试此假设:
refresh
:PUT /index/_settings
{
"index": {
"refresh_interval": "-1"
}
}
1s
(默认值)。答案 1 :(得分:0)
你可以在这里检查或发布你的弹性搜索集群的日志。它应该在你的$ log_directory /中。如果你为日志设置了tarce级别,那么这将更详细地了解集群内部发生的事情。
如果缓存是第一次查询的问题,您可以利用弹性搜索加热器在部署后加热群集缓存,或者编写调度程序以每天运行两次或三次加热。
感谢。