Как работает «нечеткое» на этапе агрегации $ searchBeta MongoDB? - PullRequest
0 голосов
/ 11 апреля 2020

Я не совсем понимаю, как нечетко работает на этапе агрегации $ searchBeta. Я не получаю желаемый результат, который мне нужен, когда я пытаюсь реализовать полнотекстовый поиск на своем сервере. Полнотекстовый поиск для MongoDB был выпущен в прошлом году (2019), так что на самом деле не так много учебников и / или ссылок на go, кроме документации. Я прочитал документацию, но я все еще в замешательстве, поэтому я хотел бы получить некоторые разъяснения.

Допустим, у меня есть эти 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

Дон Я не понимаю, почему мой результат пуст, поэтому было бы очень признательно, если бы кто-то объяснил, что я делаю неправильно.

1 Ответ

0 голосов
/ 14 апреля 2020

То, что я думаю, происходит: 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() 
...