2013-08-07 71 views
0

我正在測試我的輪胎/ 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 

這很愚蠢。而且,我不明白爲什麼這會起作用。爲什麼?!

回答

0

彈性搜索默認情況下每秒更新一次索引。

這是一個性能問題,因爲對Lucene進行更改(ES使用在引擎蓋下)可能是一項相當昂貴的操作。

如果您需要在插入文檔時立即在URL中包含refresh = true。您通常不需要這樣做,因爲每次插入大量文檔都很昂貴,但單元測試就是您希望使用它的其中一種情況。

從文檔:

刷新

要刷新發生後立即運行,使得文檔立刻出現在搜索結果索引,刷新參數可以設置爲true。只有經過認真思考和驗證,才能將此選項設置爲true,以免從索引和搜索角度出現性能不佳的情況。請注意,使用get API獲取文檔是完全實時的。

+0

我確實不同意你的看法。根據這個http://bitsandbit.es/post/11295134047/unit-testing-with-tire-and-elastic-search#disqus_thread使用user.index.refresh應該足夠了。而且,在我所有的其他測試中,這工作正常。這只是多態的一個不開心。 – simonmorley

+0

嗯......如果增加1秒等待確實解決了問題,那麼你的修改還沒有被提交。 在運行測試的其餘部分之前,您可以嘗試對索引進行顯式刷新嗎?不知道如何用輪胎做到這一點,但這裏有相同的curl命令: 'curl -XPOST'http:// localhost:9200/twitter/_refresh'' –

+0

關鍵是用戶實際上是索引的,它是標籤似乎不是。我們可以在ES中看到用戶記錄。當我們不使用多態關係時,index.refresh起作用。 – simonmorley