2017-12-08 18 views
0

며칠 전 나는 Elasticsearch에서 지리적 검색의 이상한 행동에 직면했습니다.탄성 검색 지리적 검색 이상한 행동

AWS managed ES 5.5를 REST 인터페이스를 통해 사용합니다.

위치 정보가 포인트로만 표시된 200,000 개의 개체가 있다고 가정합니다. 지리 정보 검색을 사용하여 여러 다각형 내의 점을 찾습니다. 아래 이미지에 표시됩니다. 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.coordinatesgeo_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! = # 4 # 5 +, 하지만== # 7 # 4 # 3 +

나는 이것이이 요청에서의 문제인지 예상되는 행동인지 또는 심지어 ES에서의 버그인지 이해할 수 없다.

누구나 이러한 ES 동작의 논리를 이해하고 해결책을 제시 할 수 있습니까?

감사합니다.

답변

0

Elasticsearch 팀원과 짧은 대화를 나눈 후에 AWS를 방문합니다. AWS 및 순수 ES 빌드 해시가 동일하지 않으므로 ES가 AWS 팀에 의해 수정되고 정확한 변경 사항을 알 수 없습니다. 게시 된 질문에서 검색에 영향을 줄 수있는 몇 가지 변경 사항이있을 수 있습니다. 우리는 대화를 계속하기 전에 pure ES 클러스터에서이 동작을 재현해야합니다.