在工作中,我设置了一个开发环境,我们正在测试我们的电子商务网站的弹性搜索。我注意到查询运行速度非常快(与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()));
}
}
答案 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)来提高性能。