web-dev-qa-db-ja.com

NESTクライアントから生のクエリを取得する

NESTクライアントから未加工の検索クエリを取得することは可能ですか?

var result = client.Search<SomeType>(s => s
                .AllIndices()
                .Type("SomeIndex")
                .Query(query => query
                    .Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
                );

特定の結果が得られる理由をデバッグしたいのですが。

40
Mark Walsh

これを行う方法は、メジャーバージョンごとに変わるため、わかりにくい回答があります。 これをNEST 6.xで動作させ、実際に送信する前にデシリアライズされたリクエストを確認したい場合、それはかなり簡単です:

var json = elasticClient.RequestResponseSerializer.SerializeToString(request);

Visual Studioでデバッグしている場合は、この行の直後にブレークポイントを配置すると便利です。ヒットしたら、上のjson変数にカーソルを合わせ、 虫眼鏡 をヒットします。 JSONのニース形式のビューが表示されます。

18
Todd Menier

RequestInformationから生のクエリjsonを取得できます。

var rawQuery = Encoding.UTF8.GetString(result.RequestInformation.Request);

または、ConnectionSettingsオブジェクトのトレースを有効にして、NESTが出力をトレースするすべてのリクエストを出力するようにします

var connectionSettings = new ConnectionSettings(new Uri(elasticsearchUrl));
connectionSettings.EnableTrace(true);
var client = new ElasticClient(connectionSettings); 
26
Rob

ElasticSearch 5.xでは、RequestInformation.RequestプロパティはISearchResponse<T>に存在しませんが、 ここで提供される回答と同様 Elastic Client Serializerを使用して生のクエリJSONを生成できます。 SearchDescriptor。たとえば、指定されたNEST検索クエリの場合:

var results = elasticClient.Search<User>(s => s
    .Index("user")
    .Query(q => q                    
        .Exists(e => e
            .Field("location")
        )
    )            
);

次のようにして、生のクエリJSONを取得できます。

SearchDescriptor<User> debugQuery = new SearchDescriptor<User>()
    .Index("user")
    .Query(q => q                    
        .Exists(e => e
            .Field("location")
        )
    )
;

using (MemoryStream mStream = new MemoryStream())
{
    elasticClient.Serializer.Serialize(debugQuery, mStream);
    string rawQueryText = Encoding.ASCII.GetString(mStream.ToArray());
}
16
Henry C

NEST/Elasticsearch.NET v6.0.2の場合、IResponseオブジェクトのApiCallプロパティを使用します。次のような便利な拡張メソッドを作成できます。

public static string ToJson(this IResponse response)
{
    return Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}

または、Elasticに対して行われたすべてのリクエストをログに記録する場合、接続オブジェクトで応答をインターセプトできます。

var node = new Uri("https://localhost:9200");
var pool = new SingleNodeConnectionPool(node);
var connectionSettings = new ConnectionSettings(pool, new HttpConnection());
connectionSettings.OnRequestCompleted(call =>
{
    Debug.Write(Encoding.UTF8.GetString(call.RequestBodyInBytes));
});
14
Paul Taylor

リクエストを行う前に、Nest Queryから-Nest 5.3.0の場合:

var stream = new System.IO.MemoryStream();
elasticClient.Serializer.Serialize(query, stream );
var jsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());
12
Jay Shah

ネストバージョン6で使用

connextionString.DisableDirectStreaming();

その後、response.DebugInformationですべての情報を確認できます。

4
Mahyar

つかいます result.ConnectionStatus.Request

3
rkrahl

Fiddler ?! :)

0
havij