mongodb 全文搜索(full text search)

主题:记录一下mongodb如何实现基本的全文索引, 以及关于mongodb全文索引的一些基本知识

基本实现:

  1. 创建一个text 索引
# 这里的意思是对collection1里面所有字段类型为string的field都创建一个text索引
db.collection1.createIndex({ "$**": "text" } )
# 如果只想对指定的字段比如userName和schoolName创建text索引,则可以如下操作
db.collection1.createIndex({ "userName": "text","schoolName": "text" } )

     2. 查询的时候使用text 索引

   

db.collection1.find({$text: { $search: inputValue}})
# 还可以按照相似度加上排序
db.collection1.find({$text: { $search: inputValue}}, {score: {$meta: "textScore"}}).sort({ score:{$meta: "textScore"} })

最后:关于mongodb全文搜索的一些基本知识
1. text索引只能创建于类型为string或者string类型数组的字段
2. 双引号表示与,比如 { $text: { $search: ““coffee shop”” } } 表示同时包含coffee和shop
3. 没有双引号只有空格表示或, 比如 { $text: { $search: “coffee shop” } 表示包含coffee 或者 shop
4. 同时表示包含与不包含用减号, 比如 { $text: { $search: “shop -coffee” } } 表示包含shop但是不包含coffee
5. mongodb的全文搜索底层是采用了Snowball的分词器, 所以你不能妄想什么都查得出来, 毕竟分词能力有限。 比如你不能要求从“asdfadssdasa” 查出中间的ad, 这明显就分不出来一个词。那些很明显的分隔符反而是分词的很好参考。具体可以自行了解分词。

一些基本的限制
1. 一个查询最多可以指定一个$text表达式。
2. $text查询不能出现在$nor表达式中。
3. $text查询不能出现在$elemMatch查询表达式或$elemMatch表达式中。
4. 要$text在$or表达式中使用查询,$or必须对数组中的所有子句都建立索引。
5. hint()如果查询包含$text查询表达式,则无法使用。
6. $natural如果查询包含$text表达式,则不能指定排序顺序。
7. 不能将$text需要特殊文本索引的表达式与需要不同类型特殊索引的查询运算符组合在一起。例如,不能将$text表达式与$near运算符结合在一起。
8. 视图不支持文本搜索。

如果$text在聚合中使用运算符,则以下限制也适用。
1. $match包含 $text的stage必须是管道中的第一个stage。
2. 一个text操作员在该stage只能出现一次。
3. text操作不能出现在\ $or或$not表达式。
4. 默认情况下,文本搜索不会按匹配分数的顺序返回匹配的文档。要按降序排序,请m e t a 在 meta在meta在sort 阶段中使用 聚合表达式。
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金乌爬虫

你的鼓励是我创造的最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值