如何使用Spring Data MongoDB组合文本和地理查询?

时间:2015-10-15 18:41:42

标签: mongodb spring-data-mongodb

根据Mongodb文档"Queries cannot use both text and Geospatial Indexes"表示我们无法在Single Spring Data Mongo存储库方法中同时使用$textSearch$nearSphere

但是我正在寻找一些解决方法,这将允许我同时使用TextCriterianearSphere 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

1 个答案:

答案 0 :(得分:5)

在一个查询中组合2个特殊索引结构(在撰写本文时)使用MongoDB可能。这意味着文本索引不能与地理空间索引一起使用 $near要求对2d或2dsphere索引进行操作,因此无法与文本搜索结合使用。

但是,可以使用不需要地理空间索引的$geoWithin。使用PolygonCircle来构建

等查询
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)