如何与geoNear一起执行文本搜索?

时间:2014-03-23 19:33:07

标签: mongodb full-text-search

我正在编写一个Mongo查询构建器,我在文档中找到了两个语句:

  

(文本搜索)包含$ text的$ match阶段必须是管道中的第一个阶段。

     

(地理搜索)您只能将$ geoNear用作管道的第一个阶段。

这基本上意味着相同,所以...如何一起使用它们?

2 个答案:

答案 0 :(得分:1)

我认为你不能。我过去做过的一件事就是执行两个查询并将结果合并到应用程序代码中。

答案 1 :(得分:0)

我知道这是一个古老的问题,但是最近我遇到了类似的问题,所以我认为应该发布解决方案。

就我而言,我想要:

  • 首先对用户提供的关键字使用全文搜索作为过滤器
  • 然后,按照与用户提供的坐标之间的距离对结果进行排序
  • 用户可以选择提供关键字,位置或同时提供二者(困难的情况)

我用如下代码块解决了它:


let query = {}

if(req.query.keywords){
  if(req.query.lng || req.query.lat){
    db.collection("service")
      .find({ $text: { $search: req.query.keywords }})
      .toArray()
      .then(docs => query._id = { $in: docs.map(doc => doc._id) })
  } else {
    query.$text = { $search: req.query.keywords }
  }
}

if(req.query.lat && req.query.lng){
  query.location = {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [req.query.lng, req.query.lat]
      }
    }
  }
}

db.collection("service").find(query)

基本上,如果仅需要文本搜索或地理搜索,就可以构建适当的查询。如果两者都需要,它将首先进行文本查询,然后将返回的文档ID作为过滤器传递给第二个。

这是我能找到的最高效的解决方案!