2017-05-19 5 views
2

J'essaie de créer le proxy le plus simple possible dans une API pour exécuter des recherches sur les nœuds ElasticSearch. La seule raison pour que le proxy soit là est de "cacher" les informations d'identification et les ES abstraits du point de terminaison de l'API.ElasticSearch NEST Exécution d'une requête brute DSL

Avec Nest.ElasticClient, existe-t-il un moyen d'exécuter une requête de chaîne brute? exemple de requête qui est valable dans ES vanille:

{ 
    "query": { 
     "fuzzy": { "title": "potato" } 
    } 
} 

Dans mon API, j'ai essayé désérialisation la chaîne brute en SearchRequest, mais il échoue. Je suppose qu'il ne peut pas désérialiser le terrain:

var req = m_ElasticClient.Serializer.Deserialize<SearchRequest>(p_RequestBody); 
var res = m_ElasticClient.Search<T>(req); 
return m_ElasticClient.Serializer.SerializeToString(res); 

System.InvalidCastException: Invalid cast from 'System.String' to 'Newtonsoft.Json.Linq.JObject'. 

est-il un moyen de transmettre la requête simplement de chaîne brute pour ES et retourner la réponse de la chaîne? J'ai essayé d'utiliser la méthode LowLevel.Search sans chance.

Répondre

3

NEST ne supporte pas désérialisation la forme abrégée de "field_name" : "your_value" de la ElasticSearch de requête DSL, mais il prend en charge la forme longue "field_name" : { "value" : "your_value" }, de sorte que les travaux suivants

var client = new ElasticClient(); 

var json = @"{ 
    ""query"": { 
     ""fuzzy"": { 
      ""title"": { 
       ""value"": ""potato"" 
      } 
     } 
    } 
}"; 

SearchRequest searchRequest; 
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
{ 
    searchRequest = client.Serializer.Deserialize<SearchRequest>(stream); 
} 

Comme Rob has answered, NEST soutient également supplying a raw json string as a query

+0

Bien! Bon à savoir ElasticSearch prend également en charge ce format. – MicG

2

Oui, vous pouvez le faire avec NEST, consultez les liens suivants

var searchResponse = client.Search<object>(s => s 
     .Type("type").Query(q => q.Raw(@"{""match_all"":{}}"))); 

espoir qui aide.

+0

Cela fonctionne si la chaîne est seulement la partie de la requête, mais que se passe-t-il si je veux tout le descripteur de la requête, y compris "taille", "from" et "aggs" par exemple? – MicG

+0

La requête brute @MicG n'autorise que la partie de la requête et est destinée aux cas où de nouvelles requêtes sont introduites mais que le client ne les a pas encore, ou lorsqu'il existe des bogues. Si vous souhaitez envoyer toute la requête de recherche json, consultez le client de bas niveau: https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/elasticsearch-net-getting- start.html Jetez un oeil à la section de recherche dans le guide de démarrage pour NEST pour savoir comment utiliser les deux ensemble: https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/nest-getting -started.html # _searching_2 –