ElasticSearch возвращает элементы, которые находятся слишком далеко при использовании фильтра geo_distance

#geolocation #geospatial #geo #elasticsearch

#геолокация #геопространственный #гео #elasticsearch

Вопрос:

Когда я ищу свои документы ElasticSearch с помощью nested filter -> and -> geo_distance , я извлекаю документы, которые находятся слишком далеко (и я не хочу возвращать.) Вы можете увидеть запрос и скриншот результатов ниже (исходные результаты слева и результаты, отфильтрованные вручную, справа).

введите описание изображения здесь

Вот другая копия запроса:

 {
   "query":{
      "match_all":{

      }
   },
   "filter":{
      "and":[
         {
            "term":{
               "PropertySubType":"Single Family"
            }
         },
         {
            "term":{
               "City":"Los Angeles"
            }
         },
         {
            "geo_distance":{
               "distance":"2.25miles",
               "Location":[
                  34.111583657,
                  -118.324646099
               ]
            }
         },
         {
            "range":{
               "BedroomsTotal":{
                  "gte":3
               }
            }
         },   
         {    
            "range":{
               "BuildingSize":{
                  "gte":3000
               }
            }
         },
         {    
            "range":{
               "YearBuilt":{
                  "lte":2000
               }
            }
         },
         {    
            "terms":{
               "ListingStatus":[
                  "Active",
                  "Pending",
                  "Closed"
               ]
            } 
         } 
      ] 
   },
   "size":100
}       
  

Комментарии:

1. Я думаю, что проблема лежит где-то за пределами ES. ES не должен возвращать никаких результатов для вашего запроса, потому что 1) Местоположение должно быть в формате [lon, lat] (широта -118 не существует) и 2) если вы не изменили сопоставления индексов, «PropertySubType»: «Single Family» не должен соответствовать никаким записям. Вы использовали стандартный анализатор для PropertySubType, и поэтому это поле не должно содержать термин «Single Family» (вместо этого оно должно содержать два термина: «single» и «family»). Кстати, было бы намного проще помочь вам, если бы вы предоставили скрипт, который воспроизводит вашу проблему, например gist.github.com/1097105

2. Спасибо imotov, оказывается, мне нужно было использовать «плоскость» вместо «дуги». Я также обновил сопоставления для индексов, чтобы некоторые поля были mutli_fields, которые анализируются и не анализируются (например, «PropertySubType»)

Ответ №1:

Добавление параметра «distance_type» и установка для него значения «plane» устранили эту проблему. Смотрите «distance_type» здесь:

http://www.elasticsearch.org/guide/reference/query-dsl/geo-distance-filter.html

Комментарии:

1. В приведенных выше документах говорится, что plane тип расстояния быстрее, но обеспечивает меньшую точность. Интересно, почему вы получили бы лучшие вычисления расстояния, используя plane тип расстояния.