2015-03-31 5 views
3

J'essaie d'imiter une requête que j'ai écrite dans Sense (chrome plugin) en utilisant NEST en C#. Je ne peux pas comprendre quelle est la différence entre les deux requêtes. La requête Sense renvoie des enregistrements alors que la requête nest pas. Les requêtes sont les suivantes:ElasticSearch NEST Query

var searchResults = client.Search<File>(s => s.Query(q => q.Term(p => p.fileContents, "int"))); 

et

{ 
"query": { 
    "term": { 
     "fileContents": { 
      "value": "int" 
     } 
    } 
} 

Quelle est la différence entre ces deux questions? Pourquoi retournerait-on des disques et l'autre pas?

+0

Mentionnez la définition complète de 'client' s'il vous plaît. – bittusarkar

Répondre

6

Vous pouvez savoir ce que NEST requête utilise avec le code suivant:

var json = System.Text.Encoding.UTF8.GetString(searchResults.RequestInformation.Request); 

Ensuite, vous pouvez comparer la sortie.

+0

'.RequestInformation' n'est plus disponible pour la réponse de la requête. Y a-t-il un autre moyen de le faire? – ASN

+2

Ceci ne fonctionne pas pour la version actuelle de NEST –

6

Je préfère cette version un peu plus simple, que je viens de taper généralement dans la fenêtre immédiate .NET:

searchResults.ConnectionStatus; 

En plus d'être plus courte, il donne aussi l'URL, qui peut être très utile.

? searchResults.ConnectionStatus; 
{StatusCode: 200, 
    Method: POST, 
    Url: http://localhost:9200/_all/filecontent/_search, 
    Request: { 
    "query": { 
    "term": { 
     "fileContents": { 
     "value": "int" 
     } 
    } 
    } 
} 
3

Essayez ceci:

var searchResults2 = client.Search<File>(s => s 
    .Query(q => q 
     .Term(p => p.Field(r => r.fileContents).Value("int") 
    ) 
)); 

Followup:

  1. RequestInformation ne sont pas disponibles dans les versions les plus récentes de NEST.
  2. Je vous suggère de briser votre code dans les étapes (Ne pas construire directement des requêtes dans la méthode client.Search().

client.Search() prend Func<SearchDescriptor<T>, ISearchRequest> en entrée (paramètre).

Ma réponse d'un similar post:

SearchDescriptor<T> sd = new SearchDescriptor<T>() 
.From(0).Size(100) 
    .Query(q => q 
     .Bool(t => t 
      .Must(u => u 
       .Bool(v => v 
        .Should(
         ... 
        ) 
       ) 
      ) 
     ) 
    ); 

et a obtenu le JSON désérialisé comme ceci:

{ 
    "from": 0, 
    "size": 100, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "bool": { 
      "should": [ 
       ... 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

Il était ennuyeux bibliothèque, NEST devrait avoir quelque chose qui recrache la JSON de demande. Cependant cela a fonctionné pour moi:

using (MemoryStream mStream = new MemoryStream()) { 
    client.Serializer.Serialize(sd, mStream); 
    Console.WriteLine(Encoding.ASCII.GetString(mStream.ToArray())); 
} 

Version de la bibliothèque NEST: 2.0.0.0. La nouvelle version peut avoir une méthode plus simple pour l'obtenir (heureusement).