MongoDB соответствует частичному тексту, игнорируя акценты (диакритические знаки)

У меня есть два поля, которые я должен сопоставить с простым текстом.

В настоящее время я использую Jenssegers'Laravel Mongodb (https://github.com/jenssegers/laravel-mongodb < / а>)

Код прямо сейчас выглядит так и работает почти так, как я хочу:

$nameFilter = [[ 
    '$match' => 
    [
        '$or' =>
        [ 
            [ 
                'content.itemList.name' => ['$regex' => new Regex($request->q, 'i')] 
            ],
            [ 
                'content.itemList.commonName' => ['$regex' => new Regex($request->q, 'i')] 
            ]
        ]
    ]
]];

Чего не хватает, так это того, что я хочу игнорировать акценты в полях name и commonName, поэтому, например, если content.itemList.name - это foöBàr, а запрос - obar, я должен получить его в результатах.

Изменить: после нескольких дней попыток я еще не нашел решения.

Что-то столь тривиальное, я полагаю, должно быть легко выполнено в MongoDB.

Другие вещи, которые я пробовал:

  • Создал текстовый индекс для полей, которые я хочу искать
  • Используйте сортировку, которая, по-видимому, не работает с Regex

Примеры документов

{
    lastname: "Mbappé",
    firstname: "Kylian",
    name: "Kylian Mbappé"
    otherfields: 123
}

Что я хочу:

Запрос, который соответствует любому из lastname, firstname или name с частичной строкой (lian, appe, mbappe и т. Д.) Без учета регистра и без учета диакритики (акцента).

Хорошие совпадения должны быть, например: Mbappe appe mbappé Kylian kylian mbappe


person Gregory Wullimann    schedule 20.08.2020    source источник
comment
Если вы используете Mongodb Atlas, вы можете использовать для этого оператор автозаполнения Atlas Search. docs.atlas.mongodb.com/reference/atlas-search / autocomplete /   -  person Doug    schedule 31.08.2020


Ответы (2)


Использование регулярного выражения с сопоставлением действительно не поддерживается Использование сопоставления в mongodb $ regex

Я предполагаю, что для выполнения этой работы я бы создал обходной путь, такой как поле в данных MongoDB без диакритических знаков, чтобы использовать его для функции поиска.

Используя ваш пример документа

{
    lastname: "Mbappé",
    firstname: "Kylian",
    name: "Kylian Mbappé"
    otherfields: 123
    name_clean: "Kylian Mbappe" // this is new
}

Я бы прокомментировал исходный пост, но Stack Overflow говорит, что для этого мне нужно 50 репутации :(

person lockonzero    schedule 27.08.2020
comment
Это была альтернатива, о которой я подумал, я буду реализовывать ее, если не найду более прямого решения! - person Gregory Wullimann; 28.08.2020

Я думаю, попробуйте в mongodb, вот так, это сработает.

db.users.find ({имя: {$ regex: 'appe', $ options: 'i'}, имя: {$ regex: 'lian', $ options: 'i'}, фамилия: {$ regex: ' appé ', $ options:' i '}})

person Prakash Harvani    schedule 30.08.2020