NodeJS 如何在MongoDB图谱中实现模糊搜索以实现精确匹配

js5cn81o  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(143)

如果我的搜索查询是“Caramel Cake”,那么使用我现有的代码,搜索结果是[“Caramel Cake”,“Red Velvet Cake”,“Chocolate Truffle Cake”等等]。
我希望搜索结果是[“焦糖蛋糕”]
现有代码:

const products = await Product.aggregate([
      {
        $search : {
          index: "default",
          compound: {
            should:[
              {
                autocomplete:{
                  query: query,
                  path: "prodname",
                  fuzzy: {maxEdits: 2, prefixLength: 2}
                }
              },
              {
                autocomplete:{
                  query: query,
                  path: "prodcategory",
                  fuzzy: {maxEdits: 2, prefixLength: 2}
                }
                
              }
            ],
            minimumShouldMatch: 1,
          }
        },
      },
      {
        $project: {
          prodname: 1,
          prodimages:1,
          score: {$meta: "searchScore"},
        },
      },
      {
        $sort: {  
          score: -1,
        },
      },
      { $limit: 10},
    ]);
v2g6jxz6

v2g6jxz61#

您可以在keywordlowercaser分析器的帮助下执行text运算符搜索
1.为索引创建一个Analyzer,如下所示
1.确保您有一个多表单Map到您的搜索字段。
1.在$searchAggs管道中使用文本操作符
Analyzer应使用关键字tokenizer(较低的tokenfilters是您案例的选项)

"analyzers": [{
  "name": "keywordlowercaser",
  "tokenFilters": [{
      "type": "lowercase"
    },
    {
      "type": "icuFolding"
    }
  ],
  "tokenizer": {
    "type": "keyword"
  }
}]

更新prodname/prodcategory的Map,如下所示

"prodname": {
  "multi": {
    "stringKeyword": {
      "analyzer": "keywordlowercaser",
      "type": "string"
    }
  },
  "type": "string"
}

如下更新你的查询过滤器,在你的should子句中使用this

text: {
  path: [{
    value: property,
    multi: 'stringKeyword'
  }],
  query: values,
  fuzzy: { maxEdits: 2 }
}

请参阅https://www.mongodb.com/docs/atlas/atlas-search/analyzers/tokenizers/#std-label-keyword-tokenizer-ref
您将能够了解搜索是如何工作的

相关问题