query - ElasticSearch filtro de distancia geo con múltiples ubicaciones en matriz, ¿es posible?
elasticsearch query (2)
¿Especificó un mapeo geo_point para su documento?
curl -XDELETE ''http://localhost:9200/twitter/''
curl -XPUT ''http://localhost:9200/twitter/''
curl -XPUT ''http://localhost:9200/twitter/tweet/_mapping'' -d ''
{
"tweet" : {
"properties" : {
"locations" : {"type" : "geo_point"}
}
}
}''
curl -XPUT ''http://localhost:9200/twitter/tweet/1'' -d ''
{
"user": "kimchy",
"postDate": "2009-11-15T13:12:00",
"message": "Trying out Elastic Search, so far so good?",
"locations" : [{
"lat" : 50.00,
"lon" : 10.00
},
{
"lat" : 40.00,
"lon" : 9.00
}]
}''
curl -XPUT ''http://localhost:9200/twitter/tweet/2'' -d ''
{
"user": "kimchy",
"postDate": "2009-11-15T13:12:00",
"message": "Trying out Elastic Search, so far so good?",
"locations" : [{
"lat" : 30.00,
"lon" : 8.00
},
{
"lat" : 20.00,
"lon" : 7.00
}]
}''
curl -XGET ''http://localhost:9200/twitter/tweet/_search'' -d ''{
"query": {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "20km",
"tweet.locations" : {
"lat" : 40.00,
"lon" : 9.00
}
}
}
}
}
}''
Digamos que tenemos un montón de documentos en un índice de ElasticSearch. Cada documento tiene múltiples ubicaciones en una matriz , como esta:
{
"name": "foobar",
"locations": [
{
"lat": 40.708519,
"lon": -74.003212
},
{
"lat": 39.752609,
"lon": -104.998100
},
{
"lat": 51.506321,
"lon": -0.127140
}
]
}
De acuerdo con la guía de referencia ElasticSearch.
geo_distance
filtrogeo_distance
puede funcionar con múltiples ubicaciones / puntos por documento. Una vez que una única ubicación / punto coincida con el filtro, el documento se incluirá en el filtro.
Entonces, ¿es posible crear un filtro de distancia geo que verifique todas las ubicaciones en la matriz?
Esto no parece funcionar, desafortunadamente:
{
"filter": {
"geo_distance": {
"distance": "100 km",
"locations": "40, -105"
}
}
}
arroja " QueryParsingException[[myIndex] failed to find geo_point field [locations]
" ya que las locations
no son un solo geo_point
sino una matriz de geo_point
s.
Para Elasticsearch versión 5.1, para el mismo índice anterior, la consulta irá de esta manera,
curl -XGET ''http://localhost:9200/twitter/tweet/_search'' -d ''
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"locations": {
"lat": 40.00,
"lon": 9.00
}
}
}
}
}
}''