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 

,這將是改變基於某些條件的限制。

相關問題