• mongodb索引 全文索引


    全文索引,也叫文本索引,平时,我们百度的搜索,比如api文档的搜索,这种全局的索引就可以使用全文索引实现
    全文索引:对字符串与字符串数组创建全文可搜索对索引
    使用情况:比如有一个数据集合,存储了用户的文章,用以下的数据结构存储,{author:'',title:'',article:''},这个数据结构有三个字段,这提供了全文索引的搜索
    建立方法
    全文索引的建立方法跟之前的单键索引,复合索引,比较相似
    单键索引:db.articles.ensureIndex({key:'text'})
    复合索引:db.articles.ensureIndex({key_1:'text',key_2:'text'})
    全文索引:db.articles.ensureIndex({"$**":"text"})
    全文索引中,我们可能存在不同的字段,比如api,比如问答,比如公告,mongod中存储的表结构是不固定的
    创建全文索引
    > db.articles.ensureIndex({'article':'text'})
    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
    }
    成功后,我们看下如何使用全文查询,在这之前先插入几条简单的数据
    db.articles.find({$text:{$search:'coffee'}})
    db.articles.find({$text:{$search:'aa bb cc'}})
    db.articles.find({$text:{$search:'aa bb -cc'}})
    db.articles.find({$text:{$search:'"aa" "bb" "cc"'}})
    使用全文索引跟使用其他索引不一样,我们不再需要字段的名字,而是直接使用$text,$search进行查询,这个时候有个问题,如果创建了两个全文索引,它查的是哪一个,这个问题在mongodb中不会发生,因为在mongodb中,每个数据集合只能创建一个全文索引
    模糊查找包含某个字段
    > db.articles.find({$text:{$search:'aa'}})
    { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" }
    { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" }
    { "_id" : ObjectId("5b63894bbe4539ecd263d2d3"), "author" : "luxun", "title" : "背影", "article" : "aa bb hh oo dssd hlk" }
    看到返回结构有三个包涵aa
    我们查个只有第二个包含的
    > db.articles.find({$text:{$search:'rr'}})
    { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" }
    可以看到只有第二条文档返回了


    模糊查找多个字段

    有时候我们查询时,关键词不只有一个,可能多个,在mongodb中,可以非常简单的将他们分开
    > db.articles.find({$text:{$search:'aa bb cc'}})
    { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" }
    { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" }
    { "_id" : ObjectId("5b63894bbe4539ecd263d2d3"), "author" : "luxun", "title" : "背影", "article" : "aa bb hh oo dssd hlk" }
    我们看到都返回了,这里是或查询,包含aa或者包含bb,或者包含cc都会返回


    不包含某个字段

    有时候我们查询,想要不包含某个字符串,可以用负号
    > db.articles.find({$text:{$search:'aa bb -cc'}})
    { "_id" : ObjectId("5b638940be4539ecd263d2d2"), "author" : "luxun", "title" : "背影", "article" : "aa bb rr gg" }
    { "_id" : ObjectId("5b63894bbe4539ecd263d2d3"), "author" : "luxun", "title" : "背影", "article" : "aa bb hh oo dssd hlk" }
    可以看到,返回了两条,包含aa bb,但是不包含cc的数据

    与查找

    我们的aa bb cc是或的查找方式,有的时候我们想用与的方式查找,就需要将字符串用引号引起来
    > db.articles.find({$text:{$search:'"aa" "bb" "cc"'}})
    { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" }
    > db.articles.find({$text:{$search:""aa" "bb" "cc""}})
    { "_id" : ObjectId("5b63893abe4539ecd263d2d1"), "author" : "luxun", "title" : "背影", "article" : "aa bb cc dd ee" }
    可以看到只返回一条包含aa bb cc的一条信息
     
     
     
     
  • 相关阅读:
    21-MySQL-Ubuntu-快速回到SQL语句的行首和行末
    2- SQL语句的强化
    1-数据准备
    20-MySQL-Ubuntu-数据表的查询-子查询(九)
    19-MySQL-Ubuntu-数据表的查询-自关联(八)
    18-MySQL-Ubuntu-数据表的查询-连接(七)
    17-MySQL-Ubuntu-数据表的查询-分页(六)
    16-MySQL-Ubuntu-数据表的查询-分组与聚合(五)
    15-MySQL-Ubuntu-数据表的查询-聚合函数(四)
    14-MySQL-Ubuntu-数据表的查询-范围查询(三)
  • 原文地址:https://www.cnblogs.com/wzndkj/p/9411251.html
Copyright © 2020-2023  润新知