我想了解ElasticSearch是如何在内部支持地理空间搜索的。
对于基本搜索,它使用倒排索引;但它如何与其他搜索条件结合起来,如搜索特定半径内的特定文本。
我想了解如何存储和查询索引以支持这些查询的内部原理
eqqqjvef1#
文本和地理查询彼此分开执行。让我们举一个具体的例子:
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" ] }
然后您将match文本字段并应用geo_distance筛选器:
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" } } } ] } } ] } } }
由于geo_distance查询只分配布尔值(-->Score=1;只检查位置是否在给定半径内),因此您可能希望应用高斯function_score来提高离给定原点更近的位置。
function_score
最后,可以通过使用_geo_distance排序来覆盖这些分数,其中您可以按邻近度排序(当然,同时保持match查询不变):
_geo_distance
... "query: {...}, "sort": [ { "_geo_distance": { "location": { "lat": 40.7388, "lon": -73.9982 }, "order": "asc" } } ] }
1条答案
按热度按时间eqqqjvef1#
文本和地理查询彼此分开执行。让我们举一个具体的例子:
然后您将
match
文本字段并应用geo_distance
筛选器:由于
geo_distance
查询只分配布尔值(-->Score=1;只检查位置是否在给定半径内),因此您可能希望应用高斯function_score
来提高离给定原点更近的位置。最后,可以通过使用
_geo_distance
排序来覆盖这些分数,其中您可以按邻近度排序(当然,同时保持match
查询不变):