2015-04-03 1 views
3

Я использую эластичный поиск 1.4.1 - 1.4.4. Я пытаюсь проиндексировать геополигональную форму (документ) в свой индекс, и теперь, когда форма проиндексирована, я хочу знать, находится ли гео-координата в границах этой конкретной индексированной формы геополигона.Как узнать, находится ли гео-координата в геополигоне в elasticsearch?

GET /city/_search 
{ 
"query":{ 
    "filtered" : { 
     "query" : { 
      "match_all" : {} 
     }, 
     "filter" : { 
      "geo_polygon" : { 
       "location" : { 
        "points" : [ 
         [72.776491, 19.259634], 
         [72.955705, 19.268060], 
         [72.945406, 19.189611], 
         [72.987291, 19.169507], 
         [72.963945, 19.069596], 
         [72.914506, 18.994300], 
         [72.873994, 19.007933], 
         [72.817689, 18.896882], 
         [72.816316, 18.941052], 
         [72.816316, 19.113720], 
         [72.816316, 19.113720], 
         [72.790224, 19.192205], 
         [72.776491, 19.259634] 
        ] 
       } 
      } 
     } 
    } 
} 
} 

С выше гео многоугольник фильтр я в состоянии получить все индексированные геокоординаты лежит в пределах описанного многоугольника, но я также необходим знать, если неиндексированная гео-координаты лежат в этом географическом полигоне или нет. Я сомневаюсь, что если это возможно в упругом поиске 1.4.1.

+0

Вы хотите, чтобы у вас была возможность отправить запрос с некоторой точкой геометрии и получить возврат, указывающий, находится ли он в этом ранее опубликованном полигоне? – GlenRSmith

+0

есть. @GlenRSmith –

+3

Тогда вы захотите исследовать перколяцию. В принципе, вы будете индексировать фактический запрос в перколяторе, например, ваш запрос на фильтрацию полигонов, после чего вы отправляете документы, такие как те, которые у вас есть с геокоординатой, в конечную точку _percolate и результаты, которые возвращаются будет указывать, какие перколированные запросы вернут ваш документ в результате. – GlenRSmith

ответ

4

Да, перколятор может быть использован для решения этой проблемы.

Как и в обычном случае Elasticsearch, мы индексируем наши документы в elasticsearch, а затем выполняем запросы по индексированным данным для получения согласованных/необходимых документов.

Но перколяторы работают по-другому.

В перколяторе вы регистрируете свои запросы, а затем прокладываете свои документы через зарегистрированные запросы и возвращаете запросы, соответствующие вашим документам.

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

Так что я объясняю это примером, чтобы другие люди, столкнувшиеся с одной и той же проблемой, могли принять намек на мою проблему и решение, которое я нашел. Я бы хотел, чтобы кто-то мог улучшить мой ответ или поделиться лучшим подходом к этому.

например: -

Прежде всего нам нужно создать индекс.

PUT /city/ 

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

PUT /city/user/_mapping 
{ 
    "user" : { 
     "properties" : { 
      "location" : { 
       "type" : "geo_point" 
      } 
     } 
    } 
} 

Теперь мы можем зарегистрировать наши гео полигон запросов в перколяторах с идентификатором в качестве имени города или любого другого идентификатора вы хотите.

PUT /city/.percolator/mumbai 
{ 
    "query":{ 
     "filtered" : { 
      "query" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "geo_polygon" : { 
        "location" : { 
         "points" : [ 
          [72.776491, 19.259634], 
          [72.955705, 19.268060], 
          [72.945406, 19.189611], 
          [72.987291, 19.169507], 
          [72.963945, 19.069596], 
          [72.914506, 18.994300], 
          [72.873994, 19.007933], 
          [72.817689, 18.896882], 
          [72.816316, 18.941052], 
          [72.816316, 19.113720], 
          [72.816316, 19.113720], 
          [72.790224, 19.192205], 
          [72.776491, 19.259634] 
         ] 
        } 
       } 
      } 
     } 
    } 
} 

Зарегистрируем другой полигон фильтр гео в другой город

PUT /city/.percolator/delhi 
{ 
    "query":{ 
     "filtered" : { 
      "query" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "geo_polygon" : { 
        "location" : { 
         "points" : [ 
          [76.846998, 28.865160], 
          [77.274092, 28.841104], 
          [77.282331, 28.753252], 
          [77.482832, 28.596619], 
          [77.131269, 28.395064], 
          [76.846998, 28.865160] 
         ] 
        } 
       } 
      } 
     } 
    } 
} 

Теперь мы зарегистрировали 2 запросов в перколяторах и мы можем убедиться, сделав этот API вызов.

GET /city/.percolator/_count 

Теперь, чтобы знать, если точка гео существует с любым из зарегистрированных городов мы можем процедить документ пользователя, используя ниже запроса.

GET /city/user/_percolate 
{ 
    "doc": { 
     "location" : { 
      "lat" : 19.088415, 
      "lon" : 72.871248 
      } 
      } 
} 

Это вернет: _id как "Mumbai"

{ 
    "took": 25, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 1, 
    "matches": [ 
     { 
     "_index": "city", 
     "_id": "mumbai" 
     } 
    ] 
} 

попробовать другой запрос с различным LAT-долготой

GET /city/user/_percolate 
{ 
    "doc": { 
     "location" : { 
      "lat" : 28.539933, 
      "lon" : 77.331770 
      } 
      } 
    } 

Это вернет: _id как "дели"

{ 
    "took": 25, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 1, 
    "matches": [ 
     { 
     "_index": "city", 
     "_id": "delhi" 
     } 
    ] 
} 

Давайте запустим еще один запрос с random lat-lon

GET /city/user/_percolate 
{ 
    "doc": { 
     "location" : { 
      "lat" : 18.539933, 
      "lon" : 45.331770 
      } 
      } 
} 

, и этот запрос не будет возвращать согласованные результаты.

{ 
    "took": 5, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 0, 
    "matches": [] 
} 
+1

Ваш путь спасет мою жизнь :) –

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

  • Нет связанных вопросов^_^