猫鼬 $search 返回空数组

Mongoose $search returning empty array

在 mongoose 中使用 $search 时得到一个空数组。

架构

const mongoose = require('mongoose');

const studentSchema = new mongoose.Schema({
  name: { type: String },
});

studentSchema.index({ name: 'text' });

const Student = mongoose.model('Student', studentSchema);
module.exports = Student;

$search

const Student = require('../models/Student.Model');
(async () => {
    const result = await Student.aggregate([
           {
        $search: {
          index: 'default',
          compound: {
            must: [
              {
                text: {
                  query: 'Lee',
                  path: 'name',
                  fuzzy: {
                     maxEdits: 1,
                  },
                },
              },
            ],
          },
        },
      },
    ]);

})();

这给了我一个空数组。所以我尝试了另一种语法。

const result = await Student.aggregate().search({
      index: 'default',
      compound: {
        must: [
          {
            text: {
              query: 'Lee',
              path: 'name',
              fuzzy: {
                maxEdits: 1,
              },
            },
          },
        ],
      },
    });

这也给了我一个空数组。

为了测试模型是否有效,我使用了 findfilter,并且可以看到与 $search.

期望的类似结果
let result2 = await Student.find({});

result2 = result2.filter((p) => p.name.includes('Lee'));
    

result2 有两个文档

result2:  [
  { _id: 625f70ac90e916620045cab5, name: 'Brian Lee', __v: 0 },
  { _id: 625f70e39660b486c82b2011, name: 'Lee Cohen', __v: 0 }
]

更新:find$text 也给了我上面的正确结果,但我想实现模糊搜索,我认为你不能用 find 和 $文本`:

const resultsShort = await Student.find({ $text: { $search: 'Lee' } });

为什么 $search 不返回这两个文档?

使用$regex

db.collection.find({
  name: {
    $regex: "Lee"
  }
})

mongoplayground


创建索引

db.collection.createIndex({name:"text"})

文本搜索

db.collection.find({$text: {$search: "Lee"}})

这会创建 $text 索引而不是 Atlas Search 索引:

studentSchema.index({ name: 'text' });

以上可以去掉

您不能在猫鼬模式上创建 Atlas 搜索索引,它必须在 Atlas 站点或 CLI 上设置。

要创建 Atlas 搜索索引,请转到您的数据库 cloud.mongodb.com ->搜索-->创建搜索索引-->JSON编辑器-->下一步-->选择你的collection-->设置索引名称。这里是 'default'

然后设置索引:

{ 
  "mappings": {
    "dynamic":false,
    "fields":{
    "name":{
    "analyzer":"lucene.standard",
    "type":"string"
    }
  }
}

那么这段代码就可以了。

const result = await Student.aggregate().search({
      index: 'default',
      compound: {
        must: [
          {
            text: {
              query: 'Lee',
              path: 'name',
              fuzzy: {
                maxEdits: 1,
              },
            },
          },
        ],
      },
    });
    ```