2017-05-11 21 views
0

私は、インデックスであるtypeの整数です。coordinatesはジオポイントであり、titleは文字列です。一致するものをtitleに照会したい次に条件付きで結果をフィルタリングする必要があります。それらが半径15km以内に収まる場合は、typeのレコードを含める必要があります。 type 2でないものは、半径が7.5キロ以内の場合にのみ含める必要があります。以下のクエリはこれを実現しません。むしろ、私の索引の構造についていくらか考えてもらいました。このクエリは、タイプ2で15 km以内の一致するレコードを返します。私はこのクエリーを、タイプ2(すなわち、1)でない一致するレコードも含めて、7.5キロ以内に収まるようにすることを望みます。これは単一のESクエリで達成可能ですか?私のフィルタリング条件ロジックのElasticsearchの条件付きフィルタ

擬似コード:

if type == 2 
    filter 
     distance: 15 km 
else 
    filter 
     distance 7.5 km 

問合せ:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match": { 
      "title": "my search terms" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "geo_distance": { 
       "distance": "15km", 
       "coordinates": [ 
       -79.3931, 
       43.6709 
       ] 
      } 
      }, 
      { 
      "term": { 
       "type": "2" 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

ES 2.3

答えて

1

あなたはこのようにしたいものを達成することができます

{ 
    "query": { 
    "bool": { 
     "must": { 
     "match": { 
      "title": "my search terms" 
     } 
     }, 
     "should": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "geo_distance": { 
        "distance": "15km", 
        "coordinates": [ 
        -79.3931, 
        43.6709 
        ] 
       } 
       }, 
       { 
       "term": { 
        "type": "2" 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "must": [ 
       { 
       "geo_distance": { 
        "distance": "7.5km", 
        "coordinates": [ 
        -79.3931, 
        43.6709 
        ] 
       } 
       } 
      ], 
      "must_not": { 
       "term": { 
       "type": "2" 
       } 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

この加工さありがとうございました。 'constant_score'>' filter'の下に外側の 'bool'をネストする必要があります – Abd00s

+0

ES 2.xでは必要ありませんが、うまくいきました。 – Val

関連する問題