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的一条信息
     
     
     
     
  • 相关阅读:
    Hexo博客搭建教程
    windows7如何查看端口被占用
    openshift rhc
    .net面试题精选
    Java垃圾回收机制
    Maven 入门篇(下)
    Maven 入门篇 ( 上 )
    OPENSHIFT MYSQL使用Navicat远程连接
    ci配置smarty手记
    solr多核配置
  • 原文地址:https://www.cnblogs.com/wzndkj/p/9411251.html
Copyright © 2011-2022 走看看