Фильтр ElasticSearch geo_distance не возвращает ни одного попадания

0

Я использую ElasticSearch (1.4.0) для выполнения моего поиска.

Мне удалось настроить ElasticSearch, и все работает отлично, за исключением фильтра geo_location.

Всякий раз, когда я использую фильтр geo_location, результаты не возвращаются. Обратите внимание, что ElasticSearch не возвращает никаких ошибок. Просто нет обращений, хотя я убедился, что в моей поисковой точке есть объекты рядом.

Это упрощенная версия моего массива PHP params, который я использую для тестирования фильтра geo_distance:

    $searchParams['index'] = 'myname';
    $searchParams['type']  = 'myentity';

    $searchParams['body']['query']['filtered']['filter']['geo_distance'] = 
                    [
                        'distance' => '50km',
                        'address.geopoint' => $lat . "," $lng
                    ];

И это тело запроса curl, которое также не возвращает никаких ударов:

{
    "query" : {
        "filtered" : {
            "filter" : {
                "geo_distance" : {
                    "distance" : "50km",
                    "address.geopoint" : "51.43,-2.54"
                }
            }
        }
    }
}

Это мое сопоставление:

{  
   "myname":{  
      "mappings":{  
         "myentity":{  
            "properties":{  
               "address":{  
                  "type":"nested",
                  "properties":{  
                     "country":{  
                        "type":"string"
                     },
                     "geopoint":{  
                        "type":"geo_point",
                        "lat_lon":true
                     },
                     "house":{  
                        "type":"string"
                     },
                     "postcode":{  
                        "type":"string"
                     },
                     "street":{  
                        "type":"string"
                     },
                     "town":{  
                        "type":"string"
                     }
                  }
               },
               "categories":{  
                  "type":"string"
               },
               "tags":{  
                  "type":"string"
               }
            }
         }
      }
   }
}

Вот документ, который я ожидаю получить как попадание:

[_source] => Array (
    [categories] => Array (
    )
    [tags] => Array (
    )
    [address] => Array (
        [street] => Bristol Road
        [geopoint] => 51.4307381,-2.5417914
        [town] => Bristol
        [house] => 1
        [postcode] => BS4 5NL
        [country] => UK
    )
)

Любая помощь будет оценена.

  • 1
    Я предлагаю попробовать это из вашего php-клиента. Просто используя curl или marvel . Если проблема все еще сохраняется, обновите сообщение своим запросом, ваши данные, которые, по вашему мнению, должны быть возвращены, отображение и версию ES.
  • 0
    Я пытался использовать локон, но он все тот же. И PHP-клиент, и curl дают одинаковые результаты. Я обновил свой вопрос с большим количеством данных. Любая помощь будет оценена.
Теги:
elasticsearch

1 ответ

4
Лучший ответ

Согласно документу:

Формат в [lon, lat], обратите внимание, порядок lon/lat здесь, чтобы соответствовать GeoJSON.

Поэтому я думаю, вы должны попробовать:

address.coordinates = [$lng, $lat]


EDIT: ответ после публикации

Поскольку вы разместили свое сопоставление, я вижу вашу реальную проблему сейчас. Поскольку вы используете вложенный тип для address объекта, вам нужен вложенный запрос, похожий на:

{
    "query": {
        "nested": {
            "path": "address",
            "query": {
                "filtered": {
                    "filter": {
                        "geo_distance": {
                            "distance": "50km",
                            "geopoint": "51.43,-2.54"
                        }
                    }
                }
            }
        }
    }
}

Это либо то, либо прекратить использование вложенного типа (если я не ошибаюсь, он просто удаляет "type":"nested", из вашего сопоставления). Для этого конкретного случая использования на самом деле не требуется, и ваш оригинал будет работать.

  • 0
    Я пробовал это, но все еще ничего. Хотя вы и правы, это была еще одна проблема в моем коде, но это могло бы привести к очень плохим результатам, поскольку lat и lng были бы обращены вспять. Я исправил это сейчас, и все еще та же проблема сохраняется - нет попаданий при использовании фильтра geo_distance. Проверь мой вопрос. Я добавил больше информации, ожидаемых данных и сопоставлений.
  • 1
    @AndriusBartulis Проверьте мой ответ еще раз, я только что отредактировал его :)
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню