问题描述
我正在遵循教程说明:https://docs.mongodb.com/manual/core/index-text/
这是示例数据:
db.stores.insert(
[
{ _id: 1,name: "Java Hut",description: "Coffee and cakes" },{ _id: 2,name: "Burger Buns",description: "Gourmet hamburgers" },{ _id: 3,name: "Coffee Shop",description: "Just coffee" },{ _id: 4,name: "Clothes Clothes Clothes",description: "discount clothing" },{ _id: 5,name: "Java Shopping",description: "Indonesian goods" }
]
)
案例 1:db.stores.find( { $text: { $search: "java coffee shop" } } )
=> 找到
案例 2:db.stores.find( { $text: { $search: "java" } } )
=> 找到
案例 3:db.stores.find( { $text: { $search: "coff" } } )
=> 未找到
我期待案例 3 是 FOUND,因为查询匹配 java coffee shop
解决方法
案例 3 不适用于 $text 运算符,原因是 Mongo 创建文本索引的方式。
Mongo 采用文本索引字段值,并为字符串中的每个唯一单词而不是字符(!)创建单独的索引。
所以这意味着,对于 1 个对象:
字段名称将有 2 个索引:
- java
- 小屋
字段描述将有 3 个索引:
- 咖啡
- 和
- 蛋糕
$text 运算符将 $search 值与此索引进行比较,这就是“coff”不起作用的原因。
如果您强烈希望利用索引的优势,您必须使用 $text 运算符,但它并没有给您所有的灵活性,就像您想要的那样。
解决方案:
您可以简单地将 $regex 与区分大小写的选项 (i) 一起使用,并通过跳过和限制来优化您的查询。
如果要返回所有文档并且集合很大,$regex 会导致性能问题
您也可以查看这篇文章 https://medium.com/coding-in-depth/full-text-search-part-1-how-to-create-mongodb-full-and-partial-text-search-c09c0bae17a3 并可能为此使用通配符索引,但我不知道这是否是一个好习惯。