2017-06-23 10 views
0

私は、私たちのeコマースサイトの弾性検索をテストする開発環境をセットアップしました。私はクエリが非常に高速に(SQL Serverと比較して)実行されて気づいた。しかし、初めてクエリを実行すると、最終的にカタログ内の製品をレンダリングするまでにかなりの時間がかかります。最初のクエリの後、すべてがかなり高速に動作します。初めての弾性検索クエリ

私はサイトを離れ、同じことが起こった後にしばらくしてから再入力してください。

私たちのアプリケーションがNEST(高レベルのC#クライアント)を使用しており、明らかに最初のクエリのために、検索を遅らせるいくつかの操作を実行する必要があります。 これを防止する方法はありますか?アプリケーションの起動時にこの操作を行うようNESTを設定できますか?

PD:elasticsearch 5.4

UPDATE:

これがどのように私は私の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

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)を使用してパフォーマンスを向上させることを検討してください。

1

NESTは内部的にキャッシュを使用します。メンバーアクセスのラムダ式を文字列に変換するには、最初のリクエストで作成されるJsonContractなどを入力します。

このプライミングを事前に実行するためのNESTには何も組み込まれていません。これは意図的に遅延操作です。ただし、アプリケーションの起動時にa singleton instance of IElasticClientを初期化し、Elasticsearchに検索要求を出してキャッシュをプライミングし、それを必要とするコンポーネントにクライアントインスタンスを提供することができます。キャッシングのプライミングはいずれの方法でも実行されますが、少なくとも最初のユーザーのコールはこの方法で待機していません。

+0

私は同じ問題を抱えています。私はElasticClientとConnectionSettingsをシングルトンとして登録するためにninjectを使用しています。私のninjectモジュール内で最初のクエリを実行します。しかし、同じ問題を抱えてください! – Daniel

+0

どのように登録していますか?編集して質問に追加できますか? –

+0

更新!あなたは今見てみることができます! – Daniel