jav*_*eek 6 geospatial inverted-index elasticsearch elastic-stack
我试图了解弹性搜索如何在内部支持地理空间搜索。
对于基本搜索,它使用倒排索引;但它如何与附加搜索条件(例如搜索特定半径内的特定文本)结合起来。
我想了解如何存储和查询索引以支持这些查询的内部结构
文本查询和地理查询是分开执行的。让我们举一个具体的例子:
PUT restaurants
{
"mappings": {
"properties": {
"location": {
"type": "geo_point"
},
"menu": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
POST restaurants/_doc
{
"name": "rest1",
"location": {
"lat": 40.739812,
"lon": -74.006201
},
"menu": [
"european",
"french",
"pizza"
]
}
POST restaurants/_doc
{
"name": "rest2",
"location": {
"lat": 40.7403963,
"lon": -73.9950026
},
"menu": [
"pizza",
"kebab"
]
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要match
一个文本字段并应用geo_distance
过滤器:
GET restaurants/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"menu": "pizza"
}
},
{
"geo_distance": {
"distance": "0.5mi",
"location": {
"lat": 40.7388,
"lon": -73.9982
}
}
},
{
"function_score": {
"query": {
"match_all": {}
},
"boost_mode": "avg",
"functions": [
{
"gauss": {
"location": {
"origin": {
"lat": 40.7388,
"lon": -73.9982
},
"scale": "0.5mi"
}
}
}
]
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于geo_distance
查询仅分配一个布尔值(-->score=1;仅检查位置是否在给定半径内),因此您可能需要应用高斯function_score
来增强更接近给定原点的位置。
_geo_distance
最后,可以通过使用按邻近度排序的排序来覆盖这些分数(当然同时保持match
查询完整):
...
"query: {...},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 40.7388,
"lon": -73.9982
},
"order": "asc"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
726 次 |
最近记录: |