Полнотекстовый поиск во встроенных дочерних документах MongoID - PullRequest
1 голос
/ 21 января 2012

У меня есть модель пользователя MongoID

class User
  include Mongoid::Document
  field :name

  embeds_many :watchlists
end

, в которую встроено один ко многим

class Watchlist
  include Mongoid::Document
  field :description

  embedded_in :user
end

Я хочу найти полный текст в поле :description, котороенаходится в списке наблюдения ребенка, встроенного в пользователя.Самый тяжелый поиск проходит по 1,5 тыс. Описаний, максимум 30-40 слов каждое.

Здесь мы ограничены тем, что я разверну на Heroku, и у них нет свободного плана для индексации в настоящее время.

Затем я попытался с mongoid_fulltext (а также mongoid_search и mongoid-searchable ), но безуспешно.

У кого-нибудь есть идеи, как это сделать?

ОБНОВЛЕНИЕ:

Это пример mongoid_fulltext .Модель User встраивает много списков наблюдения.Я ищу строку в: поле описания, которое находится в списке наблюдения дочернего документа:

class Watchlist
  include Mongoid::Document

  field :description
  ...

  embedded_in :user
end

Список наблюдения встроен в пользователя:

class User
  include Mongoid::Document
  include Mongoid::FullTextSearch

  field :name
  ...

  embeds_many :watchlists

  def search_in_description
    self.watchlists.map{ |w| w.description }.join(' ')
  end
  fulltext_search_in :search_in_description
end

... но таким образом,запуск User.fulltext_search("a presentation framework based on the power of CSS3") возвращает мне только родительский документ, вызывающий совпадение (пользовательский экземпляр), а не документацию по спискам наблюдения (дочерний экземпляр).

См. Вывод: http://pastie.org/3226179

Как я могу получить только соответствующие "списки наблюдения"?(Я пробовал несколько способов безуспешно)

1 Ответ

1 голос
/ 23 января 2012

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

Если вы собираетесь делать это часто, возможно, вы захотите использовать реляционный has_many, а не embeds_many.

...