如何为 MongoDB 上的部分文本搜索创建索引?

问题描述

我正在遵循教程说明: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 并可能为此使用通配符索引,但我不知道这是否是一个好习惯。