我正在测试我的Tire / ElasticSearch查询,并且遇到了包含在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.last.to_indexed_json 检查了user_tags是否包含在内:
{"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)>}....
在我的单元测试中,除非我删除了facet过滤器,否则我得到的结果为零。
{"online_sales"=>{"_type"=>"date_histogram", "entries"=>[]}}
我的测试看起来像这样:
it "should test the online sales facets", focus: true do
User.index.delete
User.create_elasticsearch_index
user = User.create(username: 'testusername', value: 'pass', location_id: @location.id)
user.tags.create content: 'online'
user.tags.first.content.should eq 'online'
user.index.refresh
ws = User.online_sales(start: (Date.today - 10.days), :end => Date.today)
puts ws.results.facets["online_sales"]
end
我有什么遗漏,做错了或者只是误解了要通过这件事吗?提前谢谢。
- 编辑 -
它似乎与标签关系有关。我有另一种方法,** location_users **这是一个has_many通过关系。这是使用以下内容在索引上更新的:
def location_users
location.users.map(&:id)
end
我可以在搜索时看到结果中的location_users数组。对我来说没有意义,为什么其他多态关系不起作用..
- 编辑2 -
我已经通过将其放入我的测试中来解决这个问题:
User.index.import User.all
sleep 1
哪个很傻。而且,我真的不明白为什么会这样。为什么呢?!
答案 0 :(得分:0)
默认情况下,弹性搜索每秒更新一次索引。
这是一个性能问题,因为将更改提交给Lucene(ES在引擎盖下使用)可能会非常昂贵。
如果您需要立即更新,请在插入文档时在URL中包含refresh = true。您通常不希望这样,因为每次插入大量文档都很费用,但单元测试是您确实想要使用它的情况之一。
来自文档:
<强>刷新强>
要在操作发生后立即刷新索引,以便文档立即显示在搜索结果中,刷新参数可以设置为true。将此选项设置为true只应在仔细考虑并验证它不会导致性能不佳的情况下完成,无论是从索引还是从搜索的角度来看。请注意,使用get API获取文档完全是实时的。