根据Mongodb文档"Queries cannot use both text and Geospatial Indexes"
表示我们无法在Single Spring Data Mongo存储库方法中同时使用$textSearch
和$nearSphere
。
但是我正在寻找一些解决方法,这将允许我同时使用TextCriteria
和nearSphere Pint
,我没有其他方式,我真的想要做到这一点工作。
我发现https://groups.google.com/forum/#!msg/mongodb-user/pzlYGKMYMVQ/O6P5S578Xx0J表示他能够执行一些解决方法,但我不知道如何为后续查询编写Repository方法?
find({"add.loc": {$near:{$geometry: {type: "Point",coordinates:
[116.425, -31.09]}, $maxDistance: 500000}},$text:{$search: "hello"}}
我处境最糟糕
对于我的存储库方法,它给出了:
Page<User> getAddress_PositionNear(TextCriteria tc,Point gpoint, Distance d, Pageable p);
"errmsg" : "text and geoNear not allowed in same query" , "code" : 2
答案 0 :(得分:5)
在一个查询中组合2个特殊索引结构(在撰写本文时)使用MongoDB可能不。这意味着文本索引不能与地理空间索引一起使用 $near要求对2d或2dsphere索引进行操作,因此无法与文本搜索结合使用。
但是,可以使用不需要地理空间索引的$geoWithin。使用Polygon
或Circle
来构建
db.text_and_geo.find({
"loc": { "$geoWithin" : { "$geometry": { "type" : "Polygon" , "coordinates": [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] }}},
"$text" : { "$search" : "spring"}
})
db.text_and_geo.find({
"loc": { "$geoWithin": { "$center": [ [1, 1], 10 ] } } ,
"$text" : { "$search" : "spring"}
})
通过MongoTemplate
Query queryWithPolygon = TextQuery.queryText(TextCriteria.forDefaultLanguage()
.matching("spring"))
.addCriteria(
where("loc")
.within(new GeoJsonPolygon(new Point(0, 0), new Point(3, 6), new Point(6, 1), new Point(0, 0)));
List<TextAndGeo> result = template.find(queryWithPolygon, TextAndGeo.class);
Query queryWithCircle = TextQuery.queryText(TextCriteria.forDefaultLanguage()
.matching("spring"))
.addCriteria(
where("loc")
.within(new Circle(new Point(0, 0), 10));
List<TextAndGeo> result = template.find(queryWithCircle, TextAndGeo.class);
使用Repository
只需使用Within
关键字作为派生查询
Page<TextAndGeo> findByLocWithin(Circle circle, TextCriteria tc, Pageable page)