资讯专栏INFORMATION COLUMN

MongoDB string字段索引策略

rozbo / 2436人阅读

摘要:在研究的索引是发现一个奇怪的问题,给一个类型的设置索引,但是在查询的时候并没有使用索引。建立了索引后,只能对索引包含的所有字段进行全文搜索,无法对某个字段进行搜索一般索引和索引可以同时建立,以满足不同查询需求

在研究MongoDB的索引是发现一个奇怪的问题,给一个string类型的field设置text索引,但是在查询的时候并没有使用索引。比如:

db.tomcat_access_logs.ensureIndex( { url : "text" });

db.tomcat_access.logs.find( { url : "1" } ).explain();
db.tomcat_access_logs.find( { url : /1/ } ).explain();

{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 100,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 100,
    "nscannedAllPlans" : 100,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    ...
}

explain()的结果可以发现,在查询的时候只用了BasicCursor,也就是说没有使用索引。

后发现只有当使用$text查询的时候才会用到text索引:

db.tomcat_access_logs.find( { $text : { $search : "1"} } ).explain();

{
    "cursor" : "TextCursor",
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 0,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 0,
    "scanAndOrder" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    ...
}

只不过这样的话,就没有办法针对某个特定field进行查询了,因为$text是对所有text索引的field进行的全文搜索。此时只需要做一般的索引即可:

db.tomcat_access_logs.ensureIndex( { url : 1 } );

db.tomcat_access.logs.find( { url : "1" } ).explain();
db.tomcat_access.logs.find( { url : /.*1.*/g } ).explain();
{
    "cursor" : "BtreeCursor url_1",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 100,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 1,
    "indexBounds" : {
        "url" : [
            [
                "",
                {
                    
                }
            ],
            [
                /.*1.*/,
                /.*1.*/
            ]
        ]
    },
    ...
}
总结

使用db.collection.find( { url : "1"} )或者db.collection.find( { url : /.*a.*/} ),不会使用的text索引,而是一般索引。

建立了text索引后,只能对text索引包含的所有字段进行全文搜索,无法对某个字段进行搜索

一般索引和text索引可以同时建立,以满足不同查询需求

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18863.html

相关文章

  • php + MongoDB + Sphinx 实现全文检索

    摘要:此文成于年月现状目前的稳定版本为目前对英文等字母语言采用空格分词故其对中文分词支持不好目前官方中文分词方案仅支持按单字分词在基础上目前国内有两个中文分词解决方案一个是一个是没有官网文档较少可查到的最新版本可支持官方还在维护但貌似不打 NOTE : 此文成于 2017 年 3 月. 现状: Sphinx 目前的稳定版本为 2.2.11.Sphinx 目前对英文等字母语言采用空格分词,故...

    Simon_Zhou 评论0 收藏0
  • php + MongoDB + Sphinx 实现全文检索

    摘要:此文成于年月现状目前的稳定版本为目前对英文等字母语言采用空格分词故其对中文分词支持不好目前官方中文分词方案仅支持按单字分词在基础上目前国内有两个中文分词解决方案一个是一个是没有官网文档较少可查到的最新版本可支持官方还在维护但貌似不打 NOTE : 此文成于 2017 年 3 月. 现状: Sphinx 目前的稳定版本为 2.2.11.Sphinx 目前对英文等字母语言采用空格分词,故...

    dockerclub 评论0 收藏0
  • mongodb学习笔记

    摘要:用于存储布尔值真假。将一个值与二进制的元素的最低值和最高值相对比。可选,抛出异常的级别。在建立唯一索引时是否删除重复记录指定创建唯一索引。索引权重值,数值在到之间,表示该索引相对于其他索引字段的得分权重。 Robo 3T -< 可视化工具 http://blog.csdn.net/i_vic/ar... [Unit] Description=mongodb After=networ...

    lemanli 评论0 收藏0
  • 关于mongodb中选择性低的字段排序问题

    摘要:一般我们都知道不给选择性低的字段添加索引,因为这个不能提高效率。即选择性高的字段选择性低的字段方案一添加组合索引此图索引为从图上看出,还是索引没有起作用,这是因为组合索引中,用右边的字段索引,索引不起作用。 今天在开发公司评论系统的新需求时,碰到一个关于mongo sort排序的问题 条件: 1. 评论表comment中包含两个字段 ctime(添加时间),like(点赞的人数) ...

    Alliot 评论0 收藏0
  • mongodb索引

    摘要:指定为创建唯一索引。默认值为索引的名称。在建立唯一索引时是否删除重复记录指定创建唯一索引。索引权重值,数值在到之间,表示该索引相对于其他索引字段的得分权重。对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。 这种扫描全集合的查询效率是非常低的,特别在...

    30e8336b8229 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<