Я довольно плохо знаком с Morphia , MongoDB и базами данных, ориентированными на документы в целом.Я ищу общее руководство о том, как подойти к следующей проблеме.
У нас есть БД с около 500K Book
документов.
{
"isbn" : "0-691-01305-5",
"title" : "For Whom the Bell Tolls",
"titleFTS" : [
"bell",
"toll" ],
"author" : "Hemingway, Ernest",
"ratingsCount" : 138,
"rating" : "3.5",
"sales" : 10245
"price" : "12.95",
"category" : "fiction",
"description" : "The story of a young American in the International Brigades attached to a republican guerilla unit during the Spanish Civil War.",
"descriptionFTS" : [
"story",
"young",
"americ",
"internat",
"brigade",
"attach",
"republic",
"guerilla",
"unit",
"spanish",
"civil",
"war"]
}
Нам необходимо выполнить полнотекстовый поиск по полям заголовка и описания.Для этого я создал массивы titleFTS
и descriptionFTS
, которые содержат слова из полей title
и description
соответственно, отфильтрованы из стоп-слов и затем поставлены в тупик.
При поиске пользователи вводят ключевые слова, и мы возвращаем Книги, которые соответствуют всем введенным терминам, например:
db.Book.find({ titleFTS : { $all: ['spanish', 'civil', 'war']}})
db.Book.find({ descriptionFTS : { $all: ['spanish', 'civil', 'war']}})
Это отлично работает, но теперь мы подошли к трудной части: мы бы хотели заказать результаты вышеуказанных запросов на основе нескольких критериев.Один из таких предлагаемых порядков следующий:
- книги, соответствующие условиям поиска в полях
titleFTS
и descriptionFTS
- книги, соответствующие только в поле
titleFTS
- книг, совпадающих только с полем
descriptionFTS
- книг с наибольшим количеством
sales
- книг с наибольшим
rating
- книг с наибольшим
ratingscount
Наше приложение написано на Java и использует API MorphiaDB.Я могу легко представить, как написать Java Comparator для такого рода вещей, но, очевидно, я бы хотел сделать упорядочивание на уровне БД.
Что, наконец, подводит меня к вопросу: можно ли это сделать с помощью API Morphia?Или мне нужно вникать в написание Javascript с помощью DB.command ()?Требуется ли Map / Reduce?Если да, то подсказка о том, как реализовать map / lower для этой проблемы, очень поможет.