Скажем, у меня есть коллекция mongo с text index
в поле itemName
с этими тремя документами:
{
_id: ...,
itemName: 'Mashed carrots with big carrot pieces',
price: 1.29
},
{
_id: ...,
itemName: 'Carrot juice',
price: 0.79
},
{
_id: ...,
itemName: 'Apple juice',
price: 1.49
}
Затем я выполняю такой запрос:
db.items.find({ $text: { $search: 'Car' } }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } );
Как заставить mongo на возвращать документы, начинающиеся с "Car" (без учета регистра) до, возвращая любые другие документы, содержащие "Car" где-то в itemName
строка?
Итак, я хочу получить документы в следующем порядке:
[
{..., itemName: 'Carrot Juice', ...},
{..., itemName: 'Mashed carrots with big carrot pieces', ...}
]
Конечно, это предназначено для использования в функциональности поиска, поэтому имеет смысл показать пользователю элементы начиная с своей строки поиска, прежде чем показывать какие-либо другие элементы после этого.
До сих пор я использовал стандартное регулярное выражение, но производительность здесь, конечно, намного хуже! +, так как я должен искать регистр, нечувствительный, согласно документам, нормальное регулярное выражение вообще не использует никаких индексов?!
EDIT:
Кроме того, иногда поведение $text
очень странно.
Например, у меня около 10-15 предметов, где itemName
начинается со слова "Zwiebel".
Этот запрос
db.items.find({ $text: { $search: "Zwiebel" }, supplier_id: 'iNTJHEf5YgBPicTrJ' }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } );
работает как шарм и возвращает все эти документы, а этот запрос
db.items.find({ $text: { $search: "Zwie" }, supplier_id: 'iNTJHEf5YgBPicTrJ' }, { score: { $meta: "textScore" } }).sort( { score: { $meta: "textScore" } } );
ничего не возвращает! Только изменив "Zwiebel" на "Zwie" в $search
.
Я действительно не понимаю, как это возможно?!
лучший, P