Да, перколятор может быть использован для решения этой проблемы.
Как и в обычном случае 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": []
}
Вы хотите, чтобы у вас была возможность отправить запрос с некоторой точкой геометрии и получить возврат, указывающий, находится ли он в этом ранее опубликованном полигоне? – GlenRSmith
есть. @GlenRSmith –
Тогда вы захотите исследовать перколяцию. В принципе, вы будете индексировать фактический запрос в перколяторе, например, ваш запрос на фильтрацию полигонов, после чего вы отправляете документы, такие как те, которые у вас есть с геокоординатой, в конечную точку _percolate и результаты, которые возвращаются будет указывать, какие перколированные запросы вернут ваш документ в результате. – GlenRSmith