2016-10-31 6 views
2

これを行うにはインライングルービーを行う必要があるかもしれませんが、ネストしたクエリと範囲クエリを組み合わせることでこれを行うことができるはずですプロパティの配列を使用すると、これを不可能にする可能性があります。Elasticsearchのネストされた配列の範囲フィルタ

世界のどこにいるかに応じて異なる配送見積もりを提供したいと考えている商品については、私が事前に知っているカットオフ日時を事前ロードしたい1週間に1回または2回。

PUT /example_delivery 
{ 
     "mappings": { 
     "product": { 
      "properties": { 

       "delivery_times": { 
       "type": "nested", 
        "properties": { 

        "local_area": { 
         "type": "nested", 
         "properties": { 
          "cut_off_datetime": { 
           "type": "date", "format": "dateOptionalTime" 
          }, 
          "get_it_by_date": { 
           "type": "date", "format": "dateOptionalTime" 
          } 
         } 
        }, 
        "out_of_state": { 
         "type": "nested", 
         "properties": { 
          "cut_off_datetime": { 
           "type": "date", "format": "dateOptionalTime" 
          }, 
          "get_it_by_date": { 
           "type": "date", "format": "dateOptionalTime" 
          } 
         } 
        } 
        } 
       }, 
       "name": { 
        "type": "string" 
       } 
      } 
     } 
     } 
    } 

私はその後、いくつかの製品をロードすることを決定した:私はこれで行くよどこ

PUT /example_delivery/product/1 
{ 
    "name": "Product 1", 
"delivery_times":[ 
    {"local_area":[ 
    {"cut_off_datetime": "2016-10-28T14:00:00", "get_it_by_date": "2016-10-29T13:00:00"}, 
    {"cut_off_datetime": "2016-10-31T14:00:00", "get_it_by_date": "2016-11-01T23:59:59"}, 
    {"cut_off_datetime": "2016-11-01T14:00:00", "get_it_by_date": "2016-11-02T23:59:59"}, 
    {"cut_off_datetime": "2016-11-02T14:00:00", "get_it_by_date": "2016-11-03T23:59:59"} 
    ]}, 
    {"out_of_state":[ 
    {"cut_off_datetime": "2016-10-28T14:00:00", "get_it_by_date": "2016-11-01T23:59:59"}, 
    {"cut_off_datetime": "2016-10-31T14:00:00", "get_it_by_date": "2016-11-02T23:59:59"}, 
    {"cut_off_datetime": "2016-11-01T14:00:00", "get_it_by_date": "2016-11-03T23:59:59"}, 
    {"cut_off_datetime": "2016-11-02T14:00:00", "get_it_by_date": "2016-11-04T23:59:59"} 
    ]} 
] 
} 

PUT /example_delivery/product/2 
{ 
    "name": "Product 2", 
"delivery_times":[ 
    {"local_area":[ 
    {"cut_off_datetime": "2016-10-28T14:00:00", "get_it_by_date": "2016-11-29T13:00:00"}, 
    {"cut_off_datetime": "2016-10-31T14:00:00", "get_it_by_date": "2016-12-01T23:59:59"}, 
    {"cut_off_datetime": "2016-11-01T14:00:00", "get_it_by_date": "2016-12-02T23:59:59"}, 
    {"cut_off_datetime": "2016-11-02T14:00:00", "get_it_by_date": "2016-12-03T23:59:59"} 
    ]}, 
    {"out_of_state":[ 
    {"cut_off_datetime": "2016-10-28T14:00:00", "get_it_by_date": "2016-12-01T23:59:59"}, 
    {"cut_off_datetime": "2016-10-31T14:00:00", "get_it_by_date": "2016-12-02T23:59:59"}, 
    {"cut_off_datetime": "2016-11-01T14:00:00", "get_it_by_date": "2016-12-03T23:59:59"}, 
    {"cut_off_datetime": "2016-11-02T14:00:00", "get_it_by_date": "2016-12-04T23:59:59"} 
    ]} 
] 
} 

あなたが見ることができる、私は願っています。私はdelivery_times"now"gteあるcut_off_datetimeオブジェクトが、get_it_by_dateがターゲットにlteである少なくとも一つが存在するためだけの製品を返すように検索を行うが、delivery_times.local_areaまたはdelivery_times.out_of_stateのネストされたパスにフィルタを適用することができるようにしたいですユーザーがフィルタで指定した時間。私が言うように、多分

GET example_delivery/_search 
{ 
     "query" : { "match_all" : {} }, 
     "filter" : { 
      "nested" : { 
       "path" : "delivery_times", 
       "filter" : { 
     "range" : 
     { 
     "delivery_times.local_area.cut_off_datetime" :   { 
      "gte": "now" 
      } 
     } 
     } 
    } 
    } 
} 

私はアレイ全体の照会について賢くなる必要があるかどうか思ったんだけど、と:でも、ちょうど空のセットで将来の結果では、カットオフタイムを持っているマッチした製品を取得これをインライン・グルーヴィーで行いますが、これを行うためのより簡単な方法があるかどうか疑問に思っています。

答えて

1

最後のネストレベルまで1レベル下に移動する必要があります。このクエリは機能します。 inner_hitsを使用して、一致するネストされたドキュメントを取得することもできます。

{ 
    "query": { 
    "nested": { 
     "path": "delivery_times", 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "nested": { 
       "path": "delivery_times.out_of_state", 
       "query": { 
        "range": { 
        "delivery_times.out_of_state.cut_off_datetime": { 
         "gte": "now" 
        } 
        } 
       } 
       } 
      }, 
      { 
       "nested": { 
       "path": "delivery_times.local_area", 
       "query": { 
        "range": { 
        "delivery_times.local_area.cut_off_datetime": { 
         "gte": "now" 
        } 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
関連する問題