2017-06-06 78 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调用。我不认为性能会成为一个问题,但谁知道可能会有一个垃圾收集的基调来清理它。这也可能有助于保护您免受某种注射攻击。 –