#java #mongodb #spring-boot #spring-data #spring-data-mongodb
#java #mongodb #spring-загрузка #spring-данные #spring-data-mongodb
Вопрос:
У меня есть динамический запрос, который зависит от текстового индекса, а также других полей. Я хочу иметь возможность указать минимальный балл, чтобы из запроса не возвращались данные ниже минимального, потому что соответствие текста недостаточно близко к тому, что мы собираемся включить в результаты.
Я попробовал следующее, но вместо того, чтобы вернуть мне то, что я ожидал, запрос просто ничего не возвращает.
Query dynamicQuery = new Query().with(pageable);
if(includeSearch){
TextCriteria textCriteria = TextCriteria.forDefaultLanguage().matchingAny(search.trim());
Criteria minScoreCriteria = Criteria.where("score").gte(2.0);
dynamicQuery.addCriteria(textCriteria);
dynamicQuery.addCriteria(minScoreCriteria);
}
if(includeSomethingElse){
Criteria genreCriteria = Criteria.where("somethingelse").in(list);
dynamicQuery.addCriteria(genreCriteria);
}
if(includeAnotherThing){
Criteria bpmCriteria = Criteria.where("anotherThing").gte(range[0]).lte(range[1]);
dynamicQuery.addCriteria(bpmCriteria);
}
List<MyClass> vos = mongoTemplate.find(dynamicQuery, MyClass.class, "collection_name");
Комментарии:
1. Поиск в MongoDB Atlas был бы гораздо лучшим способом для достижения этой цели. Таким образом, вы получите оценку релевантности Lucene из коробки. Это быстрее, лучше и более специфично для языка.
Ответ №1:
Текстовая оценка ( { $meta: "textScore" }
) может использоваться только для проецирования и сортировки в обычных запросах. Поэтому запрос не соответствует никаким документам.
Для получения более подробной информации, пожалуйста, смотрите: Метаданные текстовой оценки
Пожалуйста, используйте Aggregation
для фильтрации по баллам, как описано в справочной документации MongoDB.