zoukankan      html  css  js  c++  java
  • 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的一条信息
     
     
     
     
  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/wzndkj/p/9411251.html
Copyright © 2011-2022 走看看