2017-06-06 1 views
0

J'ai cet appel pur à Élastique qui fonctionne. Il retourne 29 docs:ElasticSearch & Nest - Mauvaise conversion

GET /idxsearch-test/movies/_search 
{ 
    "size": 20, 
    "query": { 
    "bool": { 
      "must": { 
       "bool" : { 
        "should": [ 
           {"term": {"tag.name": "Paris"}}, 
           {"multi_match" : { 
            "operator": "and", 
            "query" : "Paris", 
            "fields": ["movie_title.default^10", 
            "movie_title.snowball^2", 
            "movie_title.shingles^2", 
            "movie_title.ngrams"]}} 
          ] 
       } 
      }, 
      "filter": { 
       "term": { "is_adult": false } 
      } 
     } 
    }, 
    "_source": ["id_content", "movie_title", "vote_average", "tag.name", "is_adult"] 
} 

-je utiliser Nest, donc je converti en cela. Il retourne 0:

 var vod = client.Search<dynamic>(s => s 
          .Size(10) 
          .From(1) 
          .Index(defaultIndex) 
          .Type("movies") 
          .Query(qry1 => qry1 
              .FunctionScore(fs => 
                fs.Query(qry2 => 
                   qry2.Bool(bool1 => 
                      bool1.Must(must1 => 
                         must1.Bool(bool2 => 
                            bool2.Should(should1 => 
                            { 
                             QueryContainer qc = null; 
                             qc &= should1.Term(tt => tt.Field("tag.name").Value(keywords)); 
                             qc &= should1.MultiMatch(mm1 => mm1.Fields(ff => ff 
                                         .Field("movie_title.default^10") 
                                         .Field("movie_title.snowball^2") 
                                         .Field("movie_title.shingles^2") 
                                         .Field("movie_title.ngrams")) 
                                     .Operator(Operator.And) 
                                     .Query(keywords)); 

                             return qc; 
                            }) 
                           ) 
                         ) 
                      .Filter(fil => 
                      { 
                       QueryContainer query = null; 
                       if (!includeAdult) 
                        query &= fil.Terms(fil2 => fil2.Field("is_adult").Terms(false)); 

                       return query; 
                      }) 
                     ) 
                  ) 
              .BoostMode(FunctionBoostMode.Sum) 
              .Functions(ff => ff.FieldValueFactor(fv => fv.Field("vote_average") 
                         .Factor(0.5) 
                         .Modifier(FieldValueFactorModifier.Log1P))) 
          )) 
       ); 

Mais les résultats sont différents ... Qu'est-ce que je manque?

Y at-il un moyen de faire le même appel d'une manière plus propre et plus correcte?

acclamations

+0

Désolé, mais les deux requêtes SEAM être complètement différent? Es-tu en train d'essayer d'écrire le premier avec un nid? –

+0

@FilipCordas Bonjour. Oui, mais ils ne sont pas si différents, dans le nid il y a les trucs de Score que j'ai enlevés du simple json post. Bravo – 2Fast4YouBR

Répondre

1

La première requête peut être écrite comme

//Fluent 
      client.Search<dynamic>(
       s => s. 
       Index("idxsearch-test"). 
       Type("movies"). 
       Take(20). 
       Query(q => q.Bool(
           b => b.Must(m => m.Term(t => t.Field("tag.name").Value("Paris")) || 
               m.MultiMatch(mm => mm.Fields(f => f. 
                       Field("movie_title.default", 10). 
                       Field("movie_title.snowball", 2). 
                       Field("movie_title.shingles", 2). 
                       Field("movie_title.ngrams")))). 
             Filter(f => includeAdult ? f.Term(t => t.Field("is_adult").Value("")) : null))). 
       Source(sc => sc.Includes(i => i.Field("id_content").Field("movie_title").Field("vote_average").Field("tag.name").Field("is_adult")))); 

      //Object 
      client.Search<dynamic>(new SearchRequest<dynamic>("idxsearch-test", "movies") 
      { 
       Size = 20, 
       Query = new BoolQuery 
       { 
        Must = new QueryContainer[] 
        { 
         new BoolQuery 
         { 
          Should = new QueryContainer[] 
          { 
           new TermQuery() { Field = "tag.name", Value = "Paris" }, 
           new MultiMatchQuery 
           { 
            Fields = new [] { "movie_title.default^10", "movie_title.snowball^2", "movie_title.shingles^2", "movie_title.ngrams" } 
           } 
          } 
         } 
        }, 
        Filter = includeAdult ? new QueryContainer[] 
        { 
         new TermQuery { Field = "is_adult", Value = false } 
        } : null 
       }, 
       Source = new Union<bool, ISourceFilter>(new SourceFilter { Includes = new[] { "id_content", "movie_title", "vote_average", "tag.name", "is_adult" } }) 
      }); 
+0

On dirait que ça marche ... juste une question simple ... à la fin, Nest va juste monter un pur JSON et poster sur le serveur. Donc, si je fais le json et le post, sera la même chose, la seule différence serait que le compilateur ne perdra pas de traitement en millisecondes Nest stuff..correct? à votre santé. – 2Fast4YouBR

+0

@ 2Fast4YouBR C'est juste une interface plus agréable pour écrire la requête mais il fera juste un appel LowLevel avec une chaîne JSON à la fin. Je ne pense pas que la performance sera un problème, mais qui sait qu'il pourrait y avoir un ton de garbage collection nécessaire pour nettoyer tout cela. En outre, cela pourrait vous protéger contre une sorte d'attaque par injection. –