У меня есть два поля, которые я должен сопоставить с простым текстом.
В настоящее время я использую 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