2017-06-06 74 views
0

我有這個純粹的調用彈性工作。它返回29個文檔:ElasticSearch&Nest - 錯誤的轉換

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"] 
} 

我需要使用Nest,所以我轉換爲此。它返回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))) 
          )) 
       ); 

但結果是不同的......我錯過了什麼?

有沒有辦法以更清潔和正確的方式進行相同的呼叫?

歡呼

+0

很抱歉,但兩個查詢縫是完全不同的?你只是想用窩來寫第一個? –

+0

@FilipCordas嗨。是的,但它們並沒有那麼不同,在Nest中有一個我從簡單的json文章中刪除的Score文件。歡呼聲 – 2Fast4YouBR

回答

1

第一個查詢可以寫成

//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

看起來像它的工作......只是一個簡單的問題......最後,巢將只安裝一個純json和張貼到服務器。所以,如果我做的JSON和帖子,將是同樣的事情,唯一的區別是,編譯器不會失去任何毫秒處理巢東西..正確?乾杯。 – 2Fast4YouBR

+0

@ 2Fast4YouBR它只是一個更好的接口,用於編寫查詢,但最終只會使用Json字符串進行LowLevel調用。我不認爲性能會成爲一個問題,但誰知道可能會有一個垃圾收集的基調來清理它。這也可能有助於保護您免受某種注射攻擊。 –