elasticsearch - madrid - soporte nest
Obtener consulta sin formato del cliente NEST (6)
¿Es posible obtener la consulta de búsqueda sin formato del cliente NEST?
var result = client.Search<SomeType>(s => s
.AllIndices()
.Type("SomeIndex")
.Query(query => query
.Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
);
Realmente me gustaría depurar por qué estoy obteniendo ciertos resultados.
Antes de realizar la solicitud, desde Nest Query - Para Nest 5.3.0:
var stream = new System.IO.MemoryStream();
elasticClient.Serializer.Serialize(query, stream );
var jsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());
En ElasticSearch 5.x, la propiedad ISearchResponse<T>
no existe en ISearchResponse<T>
, pero de manera similar a la respuesta proporcionada aquí , puede generar el JSON de consulta sin formato utilizando el Eial Client Serializer y un SearchDescriptor. Por ejemplo, para la consulta de búsqueda NEST dada:
var results = elasticClient.Search<User>(s => s
.Index("user")
.Query(q => q
.Exists(e => e
.Field("location")
)
)
);
Puede obtener la consulta JSON en bruto de la siguiente manera:
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());
}
Los métodos para hacer esto parecen cambiar con cada versión principal, de ahí el número confuso de respuestas. Si desea que esto funcione en NEST 6.x, Y desea ver la solicitud deserializada ANTES de que se envíe , es bastante fácil:
var json = elasticClient.RequestResponseSerializer.SerializeToString(request);
Si estás depurando en Visual Studio, es útil colocar un punto de interrupción justo después de esta línea, y cuando lo golpeas, pasa el cursor sobre la variable json
arriba y golpea la cosita de lupa . Obtendrá una bonita vista formateada de JSON.
Para NEST / Elasticsearch.NET v6.0.2, use la propiedad ApiCall del objeto IResponse. Puedes escribir un método de extensión útil como este:
public static string ToJson(this IResponse response)
{
return Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}
O, si desea registrar todas las solicitudes realizadas a Elastic, puede interceptar respuestas con el objeto de conexión:
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));
});
Puede obtener la consulta sin formato json desde RequestInformation
:
var rawQuery = Encoding.UTF8.GetString(result.RequestInformation.Request);
O habilite el rastreo en su objeto ConnectionSettings
, para que NEST imprima cada solicitud para rastrear la salida
var connectionSettings = new ConnectionSettings(new Uri(elasticsearchUrl));
connectionSettings.EnableTrace(true);
var client = new ElasticClient(connectionSettings);
Utilice result.ConnectionStatus.Request
.