Elasticsearch 过滤几个 geo_points 不同的权重
Elasticsearch filter by several geo_points with different weights
我有许多文档,除了其他字段外,还有许多 geo_point
与之关联。我想查找与特定城市关联的所有文档。为此,我还有一个城市索引,我首先搜索它并从该搜索中获取带有 _score
的坐标列表。现在我想将该数据传递给文档搜索,并将找到的文档的分数乘以相应的城市分数。
假设第一个查询 returns 是一个像 [(city_coords, city_score), (...)]
这样的元组列表,我想使用 function_score
和 functions
数组构建对文档索引的查询每个城市作为一个单独的功能,具有单独的分数。
但是,当我以最简单的形式构造查询时,它会获取索引中的所有文档。这是我所做的查询:
{
'query': {
'function_score': {
'functions': [
{
"filter": {
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords
},
},
'weight': city_score
}
]
}
}
}
我错过了什么吗?如何只获取与该特定城市关联的文档?
由于您没有在 function_score
部分指定查询,因此 Elastic 假设一个 match_all 查询。因此它 returns 所有文档并为所选查询附近的文档添加一个提升。
您应该在 function_score 部分添加一个特定的查询,以过滤掉距离所选城市不够近的任何文档。像
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords1
}
},
{
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords2
}
},
... and so on
]
}
},
"functions": [
{
"filter": {
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords
},
},
"weight": city_score
}
]
}
}
}
我有许多文档,除了其他字段外,还有许多 geo_point
与之关联。我想查找与特定城市关联的所有文档。为此,我还有一个城市索引,我首先搜索它并从该搜索中获取带有 _score
的坐标列表。现在我想将该数据传递给文档搜索,并将找到的文档的分数乘以相应的城市分数。
假设第一个查询 returns 是一个像 [(city_coords, city_score), (...)]
这样的元组列表,我想使用 function_score
和 functions
数组构建对文档索引的查询每个城市作为一个单独的功能,具有单独的分数。
但是,当我以最简单的形式构造查询时,它会获取索引中的所有文档。这是我所做的查询:
{
'query': {
'function_score': {
'functions': [
{
"filter": {
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords
},
},
'weight': city_score
}
]
}
}
}
我错过了什么吗?如何只获取与该特定城市关联的文档?
由于您没有在 function_score
部分指定查询,因此 Elastic 假设一个 match_all 查询。因此它 returns 所有文档并为所选查询附近的文档添加一个提升。
您应该在 function_score 部分添加一个特定的查询,以过滤掉距离所选城市不够近的任何文档。像
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords1
}
},
{
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords2
}
},
... and so on
]
}
},
"functions": [
{
"filter": {
"geo_distance": {
"distance": "1km",
"distance_type": "plane",
"points": city_coords
},
},
"weight": city_score
}
]
}
}
}