2

我有一组使用belongs_to关联的类别和子类别中的帖子集合。此外,这些帖子与我的州和城市模型有belongs_to关系。如何通过关联限制轮胎/弹性搜索结果?

我通过对URL中的子域进行request.subdomain检查,将控制器上的帖子显示限制为属于相应位置(即城市或州)的帖子。除了使用Tire/ElasticSearch进行搜索外,此功能完美适用。

由于某些原因,我无法让Tire将搜索结果限制到属于特定位置的帖子。我尝试在模型中使用cater_accessor :request_subdomain将子域加入模型,并在控制器中添加before_filter,其中@city_or_state与子域相关联。

def set_request_subdomain 
    Post.request_subdomain = @city_or_state if [email protected]_or_state.nil? 
end 

这里是我的模型:

def self.search(params) 
tire.search(load: true, page: params[:page], per_page: 10) do 
    query { string params[:query], default_operator: "AND" } if params[:query].present? 
    filter :terms, :published => [true] 
    filter :terms, :request_subdomain => [:city_subdomain || :state_subdomain] 
end 
end 

def to_indexed_json 
    to_json(methods: [:city_name, :city_subdomain, :state_name, :state_subdomain]) 
end 

def city_name 
    self.city.name 
end 

def city_subdomain 
    city.subdomain.titleize 
end 

def state_name 
    self.state.name 
end 

def state_subdomain 
    state.subdomain.titleize 
end 

我需要搜索由位置(即子域)来限制的结果。

我在这里错过了什么?

UPDATE: 我按照this railscast并没有能够得到刻面的工作......我想也许我可以限制搜索项目基于一个面(即没有选择的小面在用户railscast),但我一直无法得到这个工作。

任何想法?

+1

看起来应该工作就好了,你检查的具体文件你必须在Elasticsearch中确保它们实际上具有你要过滤的子域,然后检查正在使用的分析器,以确保你没有搜索与你认为你实际上在http:/ /stackoverflow.com/questions/16005220/tire-terms-filter-not-working – concept47 2013-05-20 21:30:36

+0

我现在正在努力的部分是将request.subdomain与ElasticSearch中记录与该子域进行比较的逻辑......我可以使用用户选择的Facets与railscast相同的方式工作只是不能'基于'request.subdoman'自动'工作' – 2013-05-20 21:33:32

回答

1

filter :terms, :request_subdomain => [:city_subdomain || :state_subdomain] 

是后到前 - 在hashrocket的左侧应该是你的轮胎索引的属性,而右手边的是看重它应该匹配。其次,这只是普通的红宝石等等

[:city_subdomain || :state_subdomain] 

评估只是:city_subdomain,该“或”不会奇迹般地做它的方式进入查询逻辑

你想,而不是说,无论是:city_subdomain匹配某些值或state_subdomain匹配。你能做到这一点的是这样,假设subdomain是一个局部变量或参数搜索方法(远远优于一类级别的变量)

filter :or, [ 
       {:term => {:city_subdomain => subdomain}}, 
       {:term => {:state_subdomain => subdomain}} 
      ] 
+0

我已经修复了落后的元素并实现了你的':或'过滤器建议......但是它的行为像一个':和'过滤器。 – 2013-06-08 04:08:48

+0

也许你可以更新这个问题 - 很难猜测你是如何更改代码的 – 2013-06-08 08:47:40

+0

原来我只是需要将'before_filter'移动到'posts_controller.rb'文件而不是'application_controller.rb'并且之后按照正确的顺序(按照您的解决方案)将所有元素都完美地工作! – 2013-06-10 16:56:41

0

如果您正在寻找有限的结果数量,您可以随时在搜索框中运行一些红宝石,并使用sizefrom方法。

search = Tire.search(Location.index_name) do |s| 
    s.query do |q| 
     q.string "las vegas" 
    end 
    # Best used for pagination 
    s.size 25 # limit 25 results 
    s.from 0 # start at the beginning. 
end 

我不知道你需要什么,但你总是做这样的事情

if something.nil? 
    s.size 0 
else 
    s.size 25 
end 

,这将是改变基于某些条件的限制。