【问题标题】:MongoDB indexing large text field doesn't seem to make query faster?MongoDB索引大文本字段似乎并没有使查询更快?
【发布时间】:2012-04-03 14:29:05
【问题描述】:

我有 150 万条记录,每条记录都有一个包含大量文本的文本字段“正文”。我正在使用正则表达式对这些文档执行全文搜索,但没有注意到索引数据和不索引数据之间的查询时间有任何差异。

我确保“body”字段上有索引

db.documents.ensureIndex({ body: 1 });

MongoDB 花了一些时间来索引数据,当我运行时

db.documents.getIndexes()

它表明我在集合的“body”字段上有一个索引。但是查询在索引之前和之后仍然需要相同的时间。

如果我运行查询

db.documents.find({ body: /test/i });

我希望它运行得更快,因为数据已编入索引。当我这样做时

db.documents.find({ body: /test/i }).explain();

mongo 告诉我它在 body 字段上使用 BTreeCursor。

我在这里做错了吗?为什么文本数据被索引后查询时间不会减少?

【问题讨论】:

    标签: mongodb indexing


    【解决方案1】:

    查看文档以获取索引和正则表达式查询:

    http://www.mongodb.org/display/DOCS/Advanced+Queries

    对于像 /^prefix/ 这样的简单前缀查询(也称为根正则表达式), 数据库将在可用且适当时使用索引(很多 像大多数使用 LIKE 'prefix%' 索引的 SQL 数据库 表达)。这仅在您没有 i 时才有效(不区分大小写) 在旗帜中。

    【讨论】:

    • 看起来我做的一切都正常;看来我的查询选择并不是真正为 MongoDB 设计的。
    【解决方案2】:

    全文搜索是 MongoDb 并不真正适合的专用领域。

    如果您正在寻找开源和快速的东西,您应该尝试 Apache SOLR。我们已经使用了 4 年了,物超所值!

    http://lucene.apache.org/solr/

    【讨论】:

      【解决方案3】:

      您需要在该字段上创建一个 TEXT 搜索索引。

       db.documents.ensureIndex({ body: "text" });
      

      一旦创建了 TEXT 搜索索引,您就可以进行如下搜索:

       db.documents.find({ "$text": {"$search" : /test/i} });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 2021-12-14
        • 2018-02-07
        相关资源
        最近更新 更多