Переписать SQL-запрос с шиной - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь переписать запрос с шиной.

Это модель, которая у меня есть:

class User < ActiveRecord::Base
  has_many :bookmarks, :dependent => :destroy
  has_many :followed_venues, :through => :bookmarks, :source => :bookmarkable, :source_type => 'Venue'
end

Пользователь может следить за местами. И мне нужно искать места, за которыми следят определенные пользователи.

Пока я делал это с ActiveRecord:

@user.followed_venues.where(["venues.title LIKE ?", "%"+params[:q]+"%"])

Это, очевидно, не идеально, поэтому я добавил в свое приложениеasticsearch с шиной.

Как мне искать места с шинами, отфильтровывая их у пользователя?

Ответы [ 2 ]

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

Я собираюсь опубликовать ответ на свой вопрос.

Так что довольно просто искать места.Стандарт Venue.tire.search {...} Проблема заключается в том, как отфильтровать пользователя по следующим местам.Вместо того, чтобы использовать модель Venue для поиска, я решил проиндексировать закладки.

Это моя модель закладок

class Bookmark < ActiveRecord::Base
  belongs_to :bookmarkable, :polymorphic => true

  def to_indexed_json
    {
      :title => bookmarkable.display_name,
      :user_id => user_id
    }.to_json
  end
end

После этого у меня есть user_id и название места в индексе.Теперь поиск становится таким простым:

Bookmark.tire.search :load => {:include => 'bookmarkable'}, :page => page, :per_page => per_page do
  query do
    fuzzy :title => { :value => query.downcase, :min_similarity => 0.6, :prefix_length => 2}
  end
  filter :terms, {:bookmarkable_type => ["Venue"], :user_id => [user.id]}
end

Теперь это не полное решение.И я надеюсь, что я даже правильно использую filter :terms.Результат, который я сейчас получаю, - это массив закладок.Но для них легко загрузить действительные места проведения и, возможно, обернуть их в коллекцию WillPaginate для лучшей разбивки на страницы на интерфейсе.

Есть проблемы с этим решением?Как бы это сопоставилось с тем, что phoet предложил при добавлении идентификаторов пользователей в индекс места проведения?

0 голосов
/ 26 января 2012

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

Вы действительно уверены, что это правильная задача дляasticsearch?

Полагаю, было бы намного проще просто найти в индексе название места и затем найти нужные данные в реляционной базе данных.

...