【问题标题】:Mongodb query by regular expressionMongodb通过正则表达式查询
【发布时间】:2011-11-05 21:08:20
【问题描述】:

我使用 Mongodb 存储世界各地的位置列表,记录超过 200 万条。每条记录都是这样的对象:

{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }

我想执行搜索以找出所有包含“纽约”的“CITIES”,我花了大约 10 秒才得到结果(这在我的网络系统中是不可接受的)。我已经使用 ensureIndex() 函数对“城市”进行了索引,但是查询仍然很慢。

这是我的查询:

db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})

我猜问题是“正则表达式”。你能建议我在 2-3 秒内得到查询结果的解决方案吗(我在 MySQL 中有超过 4M 条记录,类似的查询只花了我 1-2 秒 - 有索引)。

感谢和问候。

【问题讨论】:

    标签: mongodb indexing pymongo


    【解决方案1】:

    如果不使用 regexp 或 javascript,您将无法在 mongodb 中使用包含操作进行搜索(它们很慢,因为工作没有索引)。

    我可以建议以小写形式存储额外的城市并通过完全匹配进行搜索。如果您想要“包含”和快速的速度,您应该使用其他全文搜索引擎,例如 solrlucene

    【讨论】:

      【解决方案2】:

      我建议使用多键。

      示例:

      { title : "this is fun" ,
        _keywords : [ "this" , "is" , "fun" ]
      }
      

      那么你可以使用

       db.articles.findOne( { _keywords: "this" } )
      

      这样会更快

      【讨论】:

        【解决方案3】:

        Mongo 在不区分大小写的情况下搜索时不使用正则表达式的索引。我建议你用大写或小写存储你的字段并使用相同的搜索。

        而不是搜索包含,如果你搜索开始像下面

        db.locations.find({"city": { "$regex": /^New York/}}) 
        

        您的查询将快速返回。

        更多信息RegularExpressions

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 2013-07-04
          • 2013-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多