我正在測試我的輪胎/ ElasticSearch查詢,並且遇到了我在to_indexed_json中包含的自定義方法的問題。出於某種原因,它看起來並沒有得到正確的索引 - 或者至少我不能過濾它。單元測試輪胎(彈性搜索) - 使用to_indexed_json方法過濾結果
在我的開發環境中,我的過濾器和構面工作正常,我得到了預期的結果。然而,在我的測試中,我不斷地看到零結果..我無法弄清楚我要出錯的地方。
我有以下幾點:
def to_indexed_json
to_json methods: [:user_tags, :location_users]
end
我的哪些user_tags方法如下所示:
def user_tags
tags.map(&:content) if tags.present?
end
標籤是我的用戶模型中的多態的關係:
has_many :tags, :as => :tagable
我搜索塊如下所示:
def self.online_sales(params)
s = Tire.search('users') { query { string '*' }}
filter = []
filter << { :range => { :created_at => { :from => params[:start], :to => params[:end] } } }
filter << { :terms => { :user_tags => ['online'] }}
s.facet('online_sales') do
date :created_at, interval: 'day'
facet_filter :and, filter
end
end
end
我已經檢查了user_tags使用User.last.to_indexed_json包括:
{"id":2,"username":"testusername", ... "user_tags":["online"] }
在我的開發環境,如果我運行下面的查詢,我得到了網上銷售的每日清單我的用戶:
@sales = User.online_sales(start_date: Date.today - 100.days).results.facets["online_sales"]
"_type"=>"date_histogram", "entries"=>[{"time"=>1350950400000, "count"=>1, "min"=>6.0, "max"=>6.0, "total"=>6.0, "total_count"=>1, "mean"=>6.0}, {"time"=>1361836800000, "count"=>7, "min"=>3.0, "max"=>9.0, "total"=>39.0, "total_count"=>7, "mean"=>#<BigDecimal:7fabc07348f8,'0.5571428571 428571E1',27(27)>}....
在我的單元測試,我得到的結果爲零,除非我刪除了小過濾器..
{"online_sales"=>{"_type"=>"date_histogram", "entries"=>[]}}
我的測試是這樣的:
有我丟失的東西,做錯了或者只是誤解得到這個通行證?提前致謝。
- 編輯 -
它似乎是與標籤關係有關。我有另一種方法,** location_users **這是一個has_many通過關係。這是索引使用更新:
def location_users
location.users.map(&:id)
end
我可以看到搜索結果中的location_users數組。沒有任何意義,我爲什麼其他多態性關係將不會工作。
- EDIT 2 -
我已經把這個在我的測試解決了這個問題:
User.index.import User.all
sleep 1
這很愚蠢。而且,我不明白爲什麼這會起作用。爲什麼?!
我確實不同意你的看法。根據這個http://bitsandbit.es/post/11295134047/unit-testing-with-tire-and-elastic-search#disqus_thread使用user.index.refresh應該足夠了。而且,在我所有的其他測試中,這工作正常。這只是多態的一個不開心。 – simonmorley
嗯......如果增加1秒等待確實解決了問題,那麼你的修改還沒有被提交。 在運行測試的其餘部分之前,您可以嘗試對索引進行顯式刷新嗎?不知道如何用輪胎做到這一點,但這裏有相同的curl命令: 'curl -XPOST'http:// localhost:9200/twitter/_refresh'' –
關鍵是用戶實際上是索引的,它是標籤似乎不是。我們可以在ES中看到用戶記錄。當我們不使用多態關係時,index.refresh起作用。 – simonmorley