2017-12-08 13 views
0

数日前、私はElasticsearchでのジオサーチの奇妙な動作に直面しました。Elasticsearch geo search奇妙な行動

私はAWS managed ES 5.5を使用していますが、明らかにRESTインターフェイスを使用しています。

場所情報がポイントとして表された200k個のオブジェクトがあるとします。ジオサーチを使用して、複数のポリゴン内の点を見つけます。それらは下の画像に示されています。 ESへの最後の要求から座標が抽出された。 polygons リクエストは公式のJava高水準RESTクライアントを使用して構築されています。リクエストのクエリは以下に添付されます。

少なくともの中のすべてのオブジェクトを検索したいと思います。ポリゴンです。ここ クエリ(実際のフィールドの名前と値を位置以外とlocationPoint.coordinates、スタブで置き換えた)

{ 
    "size" : 20, 
    "query" : { 
    "constant_score" : { 
     "filter" : { 
     "bool" : { 
      "must" : [ 
      { 
       "terms" : { 
       "field1" : [ 
        "a", 
        "b", 
        "c", 
        "d", 
        "e", 
        "f" 
       ], 
       "boost" : 1.0 
       } 
      }, 
      { 
       "term" : { 
       "field2" : { 
        "value" : "q", 
        "boost" : 1.0 
       } 
       } 
      }, 
      { 
       "range" : { 
       "field3" : { 
        "from" : "10", 
        "to" : null, 
        "include_lower" : true, 
        "include_upper" : true, 
        "boost" : 1.0 
       } 
       } 
      }, 
      { 
       "range" : { 
       "field4" : { 
        "from" : "10", 
        "to" : null, 
        "include_lower" : true, 
        "include_upper" : true, 
        "boost" : 1.0 
       } 
       } 
      }, 
      { 
       "geo_shape" : { 
       "location" : { 
        "shape" : { 
        "type" : "geometrycollection", 
        "geometries" : [ 
         { 
         "type" : "multipolygon", 
         "orientation" : "right", 
         "coordinates" : [ 
          [ 
          // coords here 
          ] 
         ] 
         }, 
         { 
         "type" : "polygon", 
         "orientation" : "right", 
         "coordinates" : [ 
          [ 
          // coords here 
          ] 
         ] 
         }, 
         { 
         "type" : "polygon", 
         "orientation" : "right", 
         "coordinates" : [ 
          [ 
          // coords here 
          ] 
         ] 
         }, 
         { 
         "type" : "polygon", 
         "orientation" : "right", 
         "coordinates" : [ 
          [ 
          // coords here 
          ] 
         ] 
         } 
        ] 
        }, 
        "relation" : "intersects" 
       }, 
       "ignore_unmapped" : false, 
       "boost" : 1.0 
       } 
      } 
      ] 
     } 
     }, 
     "boost" : 1.0 
    } 
    }, 
    "_source" : { 
    "includes" : [ 
     "field1", 
     "field2", 
     "field3", 
     "field4", 
     "field8" 
    ], 
    "excludes" : [ ] 
    }, 
    "sort" : [ 
    { 
     "field1" : { 
     "order" : "desc" 
     } 
    } 
    ], 
    "aggregations" : { 
    "agg1" : { 
     "terms" : { 
     "field" : "field1", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg2" : { 
     "terms" : { 
     "field" : "field2", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg3" : { 
     "terms" : { 
     "field" : "field3", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg4" : { 
     "terms" : { 
     "field" : "field4", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg5" : { 
     "terms" : { 
     "field" : "field5", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg6" : { 
     "terms" : { 
     "field" : "field6", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg7" : { 
     "terms" : { 
     "field" : "field7", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "agg8" : { 
     "terms" : { 
     "field" : "field8", 
     "size" : 10000, 
     "min_doc_count" : 1, 
     "shard_min_doc_count" : 0, 
     "show_term_doc_count_error" : false, 
     "order" : [ 
      { 
      "_count" : "desc" 
      }, 
      { 
      "_term" : "asc" 
      } 
     ] 
     } 
    }, 
    "map_center" : { 
     "geo_centroid" : { 
     "field" : "locationPoint.coordinates" 
     } 
    }, 
    "map_bound" : { 
     "geo_bounds" : { 
     "field" : "locationPoint.coordinates", 
     "wrap_longitude" : true 
     } 
    } 
    } 
} 

位置geo_shapeフィールドとしてマッピングされるフィールドでありますlocation.coordinatesは、geo_pointとしてマップされています。

だから、問題は次です。リクエストの結果(ヒット数)以下が表示されます。ポリゴンだけが変化しています。

# Polygons        Hits count 

1) 1,2,3,4        5565 

2) 1          4897 

3) 3,4         75 

4) 2          9 

5) 1,3,4         5543 

6) 1,2         5466 

7) 2,3,4         84 

したがって、2,3,4ポリゴンでポリゴン1の結果を追加すると、完全な要求であったように番号が取得されません。例えば

#1!=#2 +#7、また#1!=#5 +#4しかし#7 ==#4 +#3

私はそれがこの要求の問題か期待される行動か、ESのバグかを理解できません。

このようなES動作のロジックを理解したり、解決策を指摘してくれる人はいますか?

ありがとうございます!

答えて

0

Elasticsearchチームメンバーとの短い会話の後、私たちはAWSに出くわします。 AWSのビルドハッシュと純粋なESが等しくないため、ESはAWSチームによって変更されており、正確な変更はわかりません。投稿された質問の検索に影響する可能性のある変更がいくつかあります。 私たちの会話を続ける前に、この動作をpure ESクラスタで再現する必要があります。