2017-03-09 1 views
1

내가 가지고있는 다음 제출 탄성 요소의 일부로 :ElasticSearch - 범위에 중첩 된 필드에 대한 검색

"PayPlan" : { 
     "ActivePlans" : { 
      "plan1" : { 
       "startsOn" : "1", 
       "endsOn" : "999999" 
      } 
     }, 
     "someOtherData" : [ 
      NumberLong(0), 0] 
    }, 

계획의 이름은 논리없이 완전하다 ('plan2323a'또는 'plan_hh_jj'를 할 수 있으며, 곧).

startsOn이 작고 X가 작고 endsOn이 X보다 큰 계획이있는 모든 요소를 ​​검색하려면 어떻게해야합니까? 는 여러분 모두 감사합니다

내가 QUERY_STRING 또는 쿼리 범위를 사용하고 다음 형식을 사용하여이 작업을 수행 할 수없는 생각 "PayPlan.ActivePlans을. *. startsOn는"(별표가 범위에 와일드 카드로 작동하지 않았다

이것은 내가 지금 작업 한 elasticsearch 쿼리입니다 여러분 모두 감사하지만 난 그게 하위 계획을 검색 할 수 있도록 '*'로 'plan1'을 변경하려면 :

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "match_all": {} 
      }, 
      { 
       "or": { 
       "filters": [ 
        { 
        "bool": { 
         "must": [ 
         { 
          "range": { 
          "PayPlan.ActivePlans.plan1.startsOn": { 
           "lte": "1234" 
          } 
          } 
         }, 
         { 
          "range": { 
          "PayPlan.ActivePlans.plan1.endsOn": { 
           "gte": "1236" 
          } 
          } 
         } 
         ] 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

당신이 사용하는 전체 쿼리를 공유 할 수 있을까요? – Adonis

+0

질문을 편집하고 현재 작업중인 쿼리를 추가하여 다시 작성하여 모든 하위 '계획'요소를 검색하도록했습니다. – Avishay

답변

1

당신은 시작 수를 query string과 같은 :

GET test1/_search 
{ 
    "query": { 
    "query_string": { 
     "default_field": "PayPlan.ActivePlans.plan*.startsOn", 
     "query": ">0" 
    } 
    } 
} 

(빠른 테스트 실행과) 출력 :

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "test1", 
     "_type": "plan", 
     "_id": "AVq000G1mKJs7uLU8liY", 
     "_score": 1, 
     "_source": { 
      "PayPlan": { 
      "ActivePlans": { 
       "plan2": { 
       "startsOn": "2", 
       "endsOn": "999998" 
       } 
      } 
      } 
     } 
     }, 
     { 
     "_index": "test1", 
     "_type": "plan", 
     "_id": "AVq00p0pmKJs7uLU8liW", 
     "_score": 1, 
     "_source": { 
      "PayPlan": { 
      "ActivePlans": { 
       "plan1": { 
       "startsOn": "1", 
       "endsOn": "999999" 
       } 
      } 
      } 
     } 
     } 
    ] 
    } 
} 
+0

답변 해 주셔서 감사합니다. : "(범위 X) AND (범위 X)"를 얻으려면 (endsOn <= X) AND – Avishay

관련 문제