2016-10-09 2 views
0

저는 Cense에서 Sense에서 Writing Query로 옮겼습니다. 내가 가진 문제는 두 개의 쿼리 또는 필터를 결합하는 것입니다. 의미에서C#에서 ElasticSearch 쿼리 작성

나는

"and":[ 

이 작업을 수행하는 방법에 대한 아이디어를 사용? 여기

내가 할 노력하고 있어요 쿼리 중 하나입니다

{ 
    "filtered" : { 
     "query" : { 
      "term" : { "name.first" : "shay" } 
     }, 
     "filter" : { 
      "and" : [ 
       { 
        "range" : { 
         "postDate" : { 
          "from" : "2010-03-01", 
          "to" : "2010-04-01" 
         } 
        } 
       }, 
       { 
        "prefix" : { "name.second" : "ba" } 
       } 
      ] 
     } 
    } 
} 

// 시도 //

filtered = new 
{ 
    query = new 
    { 
     term = new 
     { 
      name.first = "shay" 
     } 
    }, 
    filter = new 
    { 
     and = ? 
     [  ? 
     {  ? 
      range = new 
      { 
       postDate = new 
       { 
        from = "2010-03-01", 
        to ="2010-04-01" 
       } 
      } 

      }, 
      prefix = new 
      { 
      name.second = "ba" 
      } 
     ] 
    } 
}; 

답변

0

당신이 무슨 뜻인지 모르겠지만, 당신이 원하는 모양이야 json 객체를 쓰려면 and = 뒤에 쓰는 법을 모른다.
나는 이렇게 작성해야한다고 생각한다.
and = new object[]{ new {range = new { a = "b"}}, new {prefix = new { c = "d"}} }
나는 당신이 원한다고 생각한다.

0

먼저 "and", "filtered"쿼리는 Deprecated in 2.0.0-beta1입니다. 대신 bool 쿼리를 사용하십시오. 여기

당신이 조회하는 방법이다

ElasticClient db = new ElasticClient(uri); 

      var nestSearchRequest = db.Search<dynamic>(new SearchRequest(indexName) 
      { 
       Query = new BoolQuery 
       { 
        Must = new QueryContainer[] { new TermQuery { Field = "name.first", Value = "shay" } }, 
        Filter = new QueryContainer[] { new DateRangeQuery { Field = "postDate", GreaterThanOrEqualTo = new DateTime(2010, 3, 1), LessThan = new DateTime(2010, 4, 1) }, new PrefixQuery { Field = "name.second", Value = "ba" } } 
       } 
      }); 

      var nestFluent = db.Search<dynamic>(
       s => s.Index(indexName).Type("").Query(
        q=>q.Bool(
         bq=>bq. 
          Must(q.Term("name.first","shay")). 
          Filter(
           q.DateRange(drq => drq.Field("postDate").GreaterThanOrEquals(new DateTime(2010, 3, 1)).LessThan(new DateTime(2010, 4, 1))), 
           q.Prefix("name.second", "ba"))))); 

      var lowLevelQuery = db.LowLevel.Search<dynamic>(indexName, new 
      { 
       query = new 
       { 
        @bool = new 
        { 
         must = new { term = new Dictionary<string, string> { { "name.first", "shay" } } }, 
         filter = new object[] 
         { 
          new { range = new { postDate = new { gte = new DateTime(2010, 3, 1), lt = new DateTime(2010, 4, 1) } } }, 
          new { prefix = new Dictionary<string,string>{ { "name.second", "ba" } } } 
         } 
        } 
       } 
      }); 

      var rawJSON = db.LowLevel.Search<dynamic>(indexName, @"{""query"":{ ""bool"":{ ""must"":{ ""term"":{ ""name.first"":""shay"" } },""filter"":[{ ""range"":{ ""postDate"":{ ""gte"":""2010-03-01"",""lt"":""2010-04-01"" } } },{ ""prefix"":{ ""name.second"":""ba"" } }] } }}");