2016-06-27 1 views
0

독점 여러 또는 필터 원시 쿼리를 다음과 같이 허용되었다부울 쿼리에서 여러 배타적 OR 필터는 1.x에서에서 즉 둥지의 이전 버전에서

orFilters가 더 이상 2.X에서 권장하는대로 무엇을 할 수 이것의 대용품이 되십시오. Bool Query에 Must와 함께 multiple exclusive should (s) (orfilters)를 갖는 방법? 1.x에서에서

원시 쿼리 같은

{ 
     "bool": { 
     "must": [ 
      { 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "EntityType": "ITSTrucks" 
        } 
       }, 
       { 
        "or": { 
        "filters": [ 
         { 
         "term": { 
          "AvailableDate": 36523 
         } 
         }, 
         { 
         "range": { 
          "AvailableDate": { 
          "gte": "42036" 
          } 
         } 
         } 
        ], 
        "_name": "date" 
        } 
       }, 
       { 
        "or": { 
        "filters": [ 
         { 
         "geo_distance": { 
          "OriginCoordinate": "42.815656,-73.942324", 
          "distance": "100miles", 
          "distance_type": "plane" 
         } 
         } 
        ], 
        "_name": "OriginOrFilter" 
        } 
       }, 
       { 
        "or": { 
        "filters": [ 
         { 
         "term": { 
          "IsOpen": true 
         } 
         }, 
         { 
         "term": { 
          "IsDestinationBoundaryNull": true 
         } 
         } 
        ], 
        "_name": "DestinationOrFilter" 
        } 
       } 
       ] 
      } 
      } 
     ] 
     } 
    } 

윌 뭔가?

BoolQueryDescriptor<AvailableTrucks> queryParameterMust= new BoolQueryDescriptor<AvailableTrucks>(); 
    BoolQueryDescriptor<AvailableTrucks> queryParameterShouldFirst= new BoolQueryDescriptor<AvailableTrucks>(); 
    BoolQueryDescriptor<AvailableTrucks> queryParameterShouldSecond= new BoolQueryDescriptor<AvailableTrucks>(); 
    BoolQueryDescriptor<AvailableTrucks> queryParameterShouldThird= new BoolQueryDescriptor<AvailableTrucks>(); 
    if (mustfc.Count > 0) 
    { 
     queryParameterMust.Must(mustfc.ToArray()); 
    } 
    if (shouldQueryListFirst.Count > 0) 
    { 
     queryParameterShouldFirst.Should(shouldQueryListFirst.ToArray()); 
    } 
    if (ShouldQueryListSecond.Count > 0) 
    { 
     queryParameterShouldSecond.Should(ShouldQueryListSecond.ToArray()); 
    } 
    if (ShouldQueryListThird.Count > 0) 
    { 
     queryParameterShouldThird.Should(ShouldQueryListThird.ToArray()); 
    } 
elasticClient.Search<Truck>(s => s.Query(f => f.Bool(c => c.Must(u => u.MatchAll()).Filter(q => q.Bool(b => queryParameterMust && queryParameterShouldFirst && queryParameterShouldSecond && queryParameterShouldThird)))))>Index("Trucks") 
+0

,하지만 당신은 AND (수행해야합니다), OR (정상적으로) 및 NOT :

당신이 시도 할 수 NEST를 사용하여 쿼리를 작성하려면 당신은 당신 자신의 EXOR를 만들 수 있습니다. EXOR b == (a AND NOT b) 또는 (b AND NOT a) – kiml42

답변

0

2.x.x 버전에서는 논리 OR 쿼리에 대한 Should 용어를 사용할 수 있습니다.

일부 예 :

{ 
    "bool" : { 
     "must" : { 
      "term" : { "user" : "kimchy" } 
     } 
     "should" : [ 
      { 
       "term" : { "tag" : "wow" } 
      }, 
      { 
       "term" : { "tag" : "elasticsearch" } 
      } 
     ], 
     "minimum_should_match" : 1 
    } 
} 

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

당신에게 할 수도 있습니다 둥지 그 조건을 유의하시기 바랍니다. 그래서, (must_not) 내가 elasticsearch의 EXOR 능력 모르겠어요

var mustMatchQueries = new List<QueryContainer>() 
var shouldMatchQueries = new List<QueryContainer>(); 

// ... add queries to both lists 

// aggregate queries 
var mustMatchAggregatedTerms = mustMatchQueries.Aggregate(new QueryContainer(), (s, ff) => s &= ff); 
var shouldMatchAggregatedTerms = shouldMatchQueries.Aggregate(new QueryContainer(), (s, ff) => s |= ff); 

// build descriptor 
var descriptor = new SearchDescriptor<DocumentClassName>() 
descriptor.Query(q => q.Bool(b => b.Must(m => mustMatchAggregatedTerms && m.Bool(c => c.Should(shouldMatchAggregatedTerms))))); 
+0

'should'는 질의 컨텍스트에서 필터 컨텍스트와 다르게 동작합니다. OP가 필터 컨텍스트 내에서 그것을 원한다고 생각합니다. –