主题:记录一下mongodb如何实现基本的全文索引, 以及关于mongodb全文索引的一些基本知识
基本实现:
- 创建一个text 索引
# 这里的意思是对collection1里面所有字段类型为string的field都创建一个text索引
db.collection1.createIndex({ "$**": "text" } )
# 如果只想对指定的字段比如userName和schoolName创建text索引,则可以如下操作
db.collection1.createIndex({ "userName": "text","schoolName": "text" } )
- 查询的时候使用text 索引
db.collection1.find({$text: { $search: inputValue}})
# 还可以按照相似度加上排序
db.collection1.find({$text: { $search: inputValue}}, {score: {$meta: "textScore"}}).sort({ score:{$meta: "textScore"} })
最后:关于mongodb全文搜索的一些基本知识
- text索引只能创建于类型为string或者string类型数组的字段
- 双引号表示与,比如 { $text: { $search: ““coffee shop”” } } 表示同时包含coffee和shop
- 没有双引号只有空格表示或, 比如 { $text: { $search: “coffee shop” } 表示包含coffee 或者 shop
- 同时表示包含与不包含用减号, 比如 { $text: { $search: “shop -coffee” } } 表示包含shop但是不包含coffee
- mongodb的全文搜索底层是采用了Snowball的分词器, 所以你不能妄想什么都查得出来, 毕竟分词能力有限。 比如你不能要求从“asdfadssdasa” 查出中间的ad, 这明显就分不出来一个词。那些很明显的分隔符反而是分词的很好参考。具体可以自行了解分词。
一些基本的限制
- 一个查询最多可以指定一个$text表达式。
- $text查询不能出现在$nor表达式中。
- $text查询不能出现在$elemMatch查询表达式或$elemMatch表达式中。
- 要$text在$or表达式中使用查询,$or必须对数组中的所有子句都建立索引。
- hint()如果查询包含$text查询表达式,则无法使用。
- $natural如果查询包含$text表达式,则不能指定排序顺序。
- 不能将$text需要特殊文本索引的表达式与需要不同类型特殊索引的查询运算符组合在一起。例如,不能将$text表达式与$near运算符结合在一起。
- 视图不支持文本搜索。
如果$text在聚合中使用运算符,则以下限制也适用。
- $match包含 $text的stage必须是管道中的第一个stage。
- 一个text操作员在该stage只能出现一次。
- text操作不能出现在\ $or或$not表达式。
- 默认情况下,文本搜索不会按匹配分数的顺序返回匹配的文档。要按降序排序,请
m
e
t
a
在
meta在
meta在sort 阶段中使用 聚合表达式。
更多使用: