Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Geo: geo_distance facet #286

Closed
kimchy opened this issue Aug 1, 2010 · 2 comments
Closed

Geo: geo_distance facet #286

kimchy opened this issue Aug 1, 2010 · 2 comments

Comments

@kimchy
Copy link
Member

kimchy commented Aug 1, 2010

The geo_distance facet is a facet providing information for ranges of distances from a provided geo_point including count of the number of hits that fall within each range, and aggregation information (like total). Assuming the following sample doc:

{
    "pin" : {
        "location" : {
            "lat" : 40.12,
            "lon" : -71.34
        }
    }
}

Here is an example that create a geo_distance facet from a pin.location of 40,-70, and a set of ranges.

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : {
                    "lat" : 40,
                    "lon" : -70
                },
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

Accepted Formats

In much the same way the geo_point type can accept different representation of the geo point, the filter can accept it as well:

Lat Lon As Properties

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : {
                    "lat" : 40,
                    "lon" : -70
                },
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

Lat Lon As Array

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : [40, -70],
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

Lat Lon As String

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : "40, -70",
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

Geohash

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : "drm3btev3e86",
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

Ranges

When a to or from are not set, they are assumed to be unbounded. Ranges are allowed to overlap, basically, each range is treated by itself.

Options

  • unit: The unit the ranges are provided in. Defaults to km. Can also be mi or miles.
  • distance_type: How to compute the distance. Can either be arc (better precision) or plane (faster). Defaults to arc.

Value Options

On top of the count of hits falling within each range, aggregated data can be provided (total) as well. By default, the aggregated data will simply use the distance calculated, but the value can be extracted either using a different numeric field, or a script. Here is an example of using a different numeric field:

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : "drm3btev3e86",
                "value_field" : "num1",
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

And here is an example of using a script:

{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "geo1" : {
            "geo_distance" : {
                "pin.location" : "drm3btev3e86",
                "value_script" : "doc['num1'].value * factor",
                "params" : {
                    "factor" : 5
                }
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20, "to" : 100 },
                    { "from" : 100 }
                ]
            }
        }
    }
}

Note the params option, allowing to pass parameters to the script (resulting in faster script execution instead of providing the values within the script each time).

geo_point Type

The facet does not require the geo_point type to be set. It assumes that the location object indexed includes a lat and lon numeric values. The geo_point type follows these rules and allows for more flexible indexing options / structure, but is not required.

Multi Location Per Document

The facet can work with multiple locations per document.

@kimchy
Copy link
Member Author

kimchy commented Aug 1, 2010

Geo: geo_distance facet, closed by b8b21a3.

williamrandolph pushed a commit to williamrandolph/elasticsearch that referenced this issue Jun 4, 2020
The EsSpout can be configured to 'unwrap' the retrieved document
directly into the target tuple. Unfortunately due to Storm's lifecycle
component, the configuration cannot be read from Elastic and needs to
be specified manually.

Fix elastic#282 elastic#286

EsSpout to declare real fields elastic#282

Signed-off-by: Costin Leau <costin.leau@gmail.com>
@soumilshah1995
Copy link

{ "query" : { "match_all" : {} }, "facets" : { "geo1" : { "geo_distance" : { "myloc" : "40, -70", "ranges" : [ { "to" : 10 }, { "from" : 10, "to" : 20 }, { "from" : 20, "to" : 100 }, { "from" : 100 } ] } } } }

Getting Error

{
"error": {
"root_cause": [
{
"type": "parsing_exception",
"reason": "Unknown key for a START_OBJECT in [facets].",
"line": 5,
"col": 16
}
],
"type": "parsing_exception",
"reason": "Unknown key for a START_OBJECT in [facets].",
"line": 5,
"col": 16
},
"status": 400
}

costin pushed a commit that referenced this issue Dec 6, 2022
- Adds a compute service that computes the result of a physical plan
- Integrates refresh cycle for search-idle shards
emilykmarx pushed a commit to emilykmarx/elasticsearch that referenced this issue Dec 26, 2023
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants