NESTクライアントから未加工の検索クエリを取得することは可能ですか?
var result = client.Search<SomeType>(s => s
.AllIndices()
.Type("SomeIndex")
.Query(query => query
.Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
);
特定の結果が得られる理由をデバッグしたいのですが。
これを行う方法は、メジャーバージョンごとに変わるため、わかりにくい回答があります。 これをNEST 6.xで動作させ、実際に送信する前にデシリアライズされたリクエストを確認したい場合、それはかなり簡単です:
var json = elasticClient.RequestResponseSerializer.SerializeToString(request);
Visual Studioでデバッグしている場合は、この行の直後にブレークポイントを配置すると便利です。ヒットしたら、上のjson
変数にカーソルを合わせ、 虫眼鏡 をヒットします。 JSONのニース形式のビューが表示されます。
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);
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());
}
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));
});
リクエストを行う前に、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());
ネストバージョン6で使用
connextionString.DisableDirectStreaming();
その後、response.DebugInformationですべての情報を確認できます。
つかいます result.ConnectionStatus.Request
。
Fiddler ?! :)