Morphia / MongoDB: упорядочение результатов поиска по сложным запросам - PullRequest
2 голосов
/ 18 февраля 2011

Я довольно плохо знаком с 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']}})

Это отлично работает, но теперь мы подошли к трудной части: мы бы хотели заказать результаты вышеуказанных запросов на основе нескольких критериев.Один из таких предлагаемых порядков следующий:

  1. книги, соответствующие условиям поиска в полях titleFTS и descriptionFTS
  2. книги, соответствующие только в поле titleFTS
  3. книг, совпадающих только с полем descriptionFTS
  4. книг с наибольшим количеством sales
  5. книг с наибольшим rating
  6. книг с наибольшим ratingscount

Наше приложение написано на Java и использует API MorphiaDB.Я могу легко представить, как написать Java Comparator для такого рода вещей, но, очевидно, я бы хотел сделать упорядочивание на уровне БД.

Что, наконец, подводит меня к вопросу: можно ли это сделать с помощью API Morphia?Или мне нужно вникать в написание Javascript с помощью DB.command ()?Требуется ли Map / Reduce?Если да, то подсказка о том, как реализовать map / lower для этой проблемы, очень поможет.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Я настоятельно рекомендую внешний полнотекстовый движок, например, Solr или ElasticSearch. Возможности MongoDB, связанные с полнотекстовым поиском, действительно не подходят для реального полнотекстового решения. Ваш подход с предварительным управлением и т. Д. - просто грязный обходной путь. Пока MongoDB не обеспечивает подходящей полнотекстовой интеграции, используйте внешнее решение, если вы заинтересованы в серьезном и работающем решении.

0 голосов
/ 20 февраля 2011

Lucene и solr позволяют вам строить сложные булевы запросы по многим полям, включая запросы по диапазонам номеров и даже запросы по геоданных.

...