0

我不太了解模糊在 $searchBeta 聚合阶段是如何工作的。当我尝试在后端实现全文搜索时,我没有得到想要的结果。MongoDB 的全文搜索于去年(2019 年)发布,因此除了文档之外,确实没有太多教程和/或参考资料可供参考。我已经阅读了文档,但我仍然感到困惑,所以我想澄清一下。

假设我的数据库中有这 5 个文档:

{
    "name": "Lightning Bolt",
    "set_name": "Masters 25"
},
{
    "name": "Snapcaster Mage",
    "set_name": "Modern Masters 2017"
},
{
    "name": "Verdant Catacombs",
    "set_name": "Modern Masters 2017"
},
{
    "name": "Chain Lightning",
    "set_name": "Battlebond"
},
{
    "name": "Battle of Wits",
    "set_name": "Magic 2013"
}

这是我在 MongoDB Compass 中的聚合:

db.cards.aggregate([
    {
        $searchBeta: {
            search: { //search has been deprecated, but it works in MongoDB Compass; replace with 'text'
                query: 'lightn',
                path: ["name", "set_name"],
                fuzzy: { 
                    maxEdits: 1, 
                    prefixLength: 2, 
                    maxExpansion: 100
                }
            }
        }
    }
]);

我期望我的结果是:

[
    {
        "name": "Lightning Bolt", //lightn is in 'Lightning'
        "set_name": "Masters 25"
    },
    {
        "name": "Chain Lightning", //lightn is in 'Lightning'
        "set_name": "Battlebond"
    }
]

我实际得到的:

[] //empty array

我真的不明白为什么我的结果是空的,所以如果有人解释我做错了什么,将不胜感激。

4

2 回答 2

0

我认为正在发生的事情:db.cards.aggregate... 正在“name”和“set_name”字段中查找“lightn”查询中最大编辑一个字符变体的单词的文档。卡片集合中的文档包含大于 2 的编辑,因此您的预期结果是一个空数组。“模糊用于查找与搜索词或词条相似的字符串”;与 maxEdits 和 prefixLength 一起使用。

您是否尝试过带有通配符选项的术语运算符?我认为以下聚合将为您提供您实际期望的结果。

e.g.            
    db.cards.aggregate([
        {$searchBeta: 
            {"term": 
                {"path": 
                     ["name","set_name"],
                      "query": "l*h*",
                      "wildcard":true}
          }}]).pretty() 
于 2020-04-14T05:24:47.683 回答
0

您需要提供一个索引以用于您的搜索查询。索引基本上是您的查询将用来处理您的结果的分析器,您是否想要完全匹配文本,或者您想要部分匹配等。您可以从此处阅读有关分析器的更多信息

在您的情况下,基于 STANDARD 分析器的索引会有所帮助。创建索引后,您的代码(在下面进行了修改)将起作用:

db.cards.aggregate([
    {
        $search:{
            text: { //search has been deprecated, but it works in MongoDB Compass; replace with 'text'
                index: 'index_name_for_analyzer (STANDARD in your case)'
                query: 'lightn',
                path: ["name"] //since you only want to search in one field
                fuzzy: { 
                    maxEdits: 1, 
                    prefixLength: 2, 
                    maxExpansion: 100
                }
            }
        }
    }
]);

于 2021-02-27T19:43:38.087 回答