2015-01-22 2 views
0

Я использую ElasticSearch (1.4.0) для выполнения своих поисков.ElasticSearch Фильтр geo_distance не возвращает никаких результатов

Мне удалось настроить 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 
        ]; 

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

{ 
    "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 дают одинаковые результаты. Я обновил свой вопрос с большим количеством данных. Любая помощь будет оценена по достоинству. –

ответ

3

Согласно doc:

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

Так что я думаю, вы должны попробовать:

address.coordinates = [$lng, $lat]


EDIT: Ответ после издания

Поскольку вы публикуемые вашего отображение Я вижу вашу реальную проблему сейчас. Как вы используете объект nested type для address вам нужно nested query подобное:

{ 
    "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 Проверьте мой ответ еще раз, я только что отредактировал его :) – moliware

+0

Похоже, что он работает! Теперь я могу выполнить поиск с использованием фильтра geo_distance.Итак, как бы я включил этот вложенный отфильтрованный запрос с bool-must-fuzzy, как это? Другими словами, я хочу получить все объекты, которые находятся в пределах x миль от x геоинтеграции, и где имя или категории сущностей содержат термин x, используя размытость 2. Любые мысли? –

Смежные вопросы