Firestore - 在 orderby geoHash 之后无法根据另一个字段对文档进行排序
Firestore - After orderby geoHash not able to sort documents based on another field
示例:根据评分计数获取我周围评分最高的餐厅
(假设该地区有 10,000 家餐馆,因此必须使用限制)
我在 Java 中的查询:
ref.orderBy("geoHash")
.orderBy("count", Query.Direction.DESCENDING)
.startAt(startHash)
.endAt(endHash)
.limit(limit)
但即使对于单个 GeoQueryBound,它也无法按预期工作。
示例文档:
item1 : {
geoHash : tsp1
count : 100
}
item2 : {
geoHash : tsp1
count : 200
}
item3 : {
geoHash : tsp2
count : 300
}
现在,如果我们 运行 上述查询的地理范围为 tsp0 - tsp3,限制为 2
预期结果:[item3,item2]
实际结果:[item2, item1]
这是 Firestore 的限制吗?是否有任何解决方法。
查询首先在 geoHash
上排序,然后才在 count
上排序,因此计数仅影响 geohash 相同的文档的结果。由于 item1
和 item2
具有最低的 geohash 值,它们首先出现在索引中并被正确返回。
没有有效的方法在数据库上执行此查询,除非您找到一种方法将计数合并到 geohash 值中,以便将它们按照您希望的顺序放入索引中。虽然这 可能 是可能的,但更有可能的解决方法是仅在 geohash 上进行过滤,然后在您的应用程序代码中通过计数获得最佳结果。
示例:根据评分计数获取我周围评分最高的餐厅
(假设该地区有 10,000 家餐馆,因此必须使用限制)
我在 Java 中的查询:
ref.orderBy("geoHash")
.orderBy("count", Query.Direction.DESCENDING)
.startAt(startHash)
.endAt(endHash)
.limit(limit)
但即使对于单个 GeoQueryBound,它也无法按预期工作。
示例文档:
item1 : {
geoHash : tsp1
count : 100
}
item2 : {
geoHash : tsp1
count : 200
}
item3 : {
geoHash : tsp2
count : 300
}
现在,如果我们 运行 上述查询的地理范围为 tsp0 - tsp3,限制为 2
预期结果:[item3,item2]
实际结果:[item2, item1]
这是 Firestore 的限制吗?是否有任何解决方法。
查询首先在 geoHash
上排序,然后才在 count
上排序,因此计数仅影响 geohash 相同的文档的结果。由于 item1
和 item2
具有最低的 geohash 值,它们首先出现在索引中并被正确返回。
没有有效的方法在数据库上执行此查询,除非您找到一种方法将计数合并到 geohash 值中,以便将它们按照您希望的顺序放入索引中。虽然这 可能 是可能的,但更有可能的解决方法是仅在 geohash 上进行过滤,然后在您的应用程序代码中通过计数获得最佳结果。