2017-03-09 83 views
1

我有下一個提交的作爲彈性元件的一部分:ElasticSearch - 搜索任何嵌套字段是在範圍

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

計劃名稱是完全沒有邏輯(可以是「plan2323a」或「plan_hh_jj」和等等)。

如何搜索所有具有ANO計劃的元素,其中startsOn小於X且endsOn大於X? 謝謝大家

我無法用QUERY_STRING或通過使用查詢範圍,並使用接下來的格式要做到這一點「PayPlan.ActivePlans。*。startsOn」(星號不作爲通配符的範圍內工作

謝謝大家

這是elasticsearch查詢我現在已經工作,但我想改變「計劃1」到「*」,因此它會爲所有子計劃搜索:

{ 
    "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

感謝您的回答,它讓我走上了正軌,只是一個小小的更新 - 我用「查詢」 :「(endsOn <= X)AND(startsOn <= X)」來獲得'in range' – Avishay