2017-01-13 9 views
7

AWSが管理するElasticsearchサービスを使用し、最近1.5から2.3にアップグレードしました。私たちはpythonでelasticsearch-dslパッケージを使用してクエリを作成し、ほとんどのクエリを移行することができましたが、私が試したことにかかわらずgeo_distanceは壊れています。elasticsearchに更新した後にネストされたジオポイントを見つけることができません2.3

マッピング:

{ 
     'company': { 
      'properties': { 
       'id': {'type': 'integer'}, 
       'company_number': {'type': 'string'}, 
       'addresses': { 
        'type': 'nested', 
        'properties': { 
         'postcode': {'type': 'string', 'index': 'not_analyzed'}, 
         'location': {'type': 'geo_point'} 
        } 
       } 
      } 
     } 
} 

Pythonコードelasticsearch-DSLの==とライブラリーによって生成された0.0.11

  test_location = '53.5411062377, -2.11485504709' 
      test_distance = "3miles" 
      location_filter = F("geo_distance", 
           location=test_location, 
           distance=test_distance) 
      query = query.filter("nested", 
           path="addresses", 
           filter=location_filter) 

クエリ作業:

{'query': {'filtered': {'filter': {'nested': {'filter': {'geo_distance': {'distance': u'3miles', 'location': '53.5411062377, -2.11485504709'}}, 'path': 'addresses'}}, 'query': {'match_all': {}}}}} 

を私たちは、ブランドを作成しました同じマッピングを持つ新しい2.3の新しいインデックス

== 2.1.0-DSLのelasticsearchし、更新およびクエリにフィルタを変換しようとした後、次のクエリを生成

geo_query = Q({"bool": { 
        "must": [ 
         { 
          "geo_distance": { 
           "distance": "test_distance", 
           "addresses__location": test_location, 
          } 
         }, 
        ] 
       }}) 

{'query': {'bool': {'must': [{'geo_distance': {'distance': '3 miles', u'addresses.location': {'lat': '53.5411062377', 'lon': '-2.11485504709'}}}]}}} 

を私たちは、次の例外が出ます:

「location」、「addresses.location」、「ad」フィールドを参照しようとしましたが、ドレスを作成し、古いネストされたクエリタイプを使用します。私はマッピングがもはや2.3で有効でないか、または私が間違ったクエリを構築しているかどうかわかりません。

クエリ

Q({'nested': {'filter': { 
         'geo_distance': {'distance': u'3miles', 'location': '53.5411062377, -2.11485504709'} 
        }, 
        'path': 'addresses.location'}}) 

は、次のエラーを生成します

RequestError: TransportError(400, u'search_phase_execution_exception', u'[nested] nested object under path [addresses.location] is not of nested type') 

私はlat_lon追加する必要があると思う:仕事にgeodistanceクエリのマッピングに真のが、例のどれもがそれを持っていません。

お手数をおかけしますようお願い申し上げます。

+0

'PATH'は' addresses'でなければならず、 'geo_distance'フィルタであなただけではなく、' "場所" の ' "addresses.locationを"' '持っている必要があります – Val

+0

申し訳ありませんが、私'.location'と一緒にそれを試してみました。 – marklar

+0

あなたは以下の答えを試すことができますか? – Val

答えて

1

これは動作するはずです:

 test_location = '53.5411062377, -2.11485504709' 
     test_distance = "3miles" 
     location_query = Q("geo_distance", 
          addresses__location=test_location, 
          distance=test_distance) 
     query = query.filter("nested", 
          path="addresses", 
          query=location_query) 
+0

できるだけ早くこれを試してみましょう! – marklar

+0

それでも動作しない場合は私に教えてください、我々はそれを把握します – Val

+0

これは、私がすでにそれを試して誓ったことができたにもかかわらず、働いたようだ!インデックスの再作成時に問題の根本が正しくマッピングされていないと思っていましたが、どちらの方法でも現在動作しています。私の問題に時間を費やしてくれてありがとう! – marklar

関連する問題