Rails 的项目里用了 Elasticsearch,现在想要去搜索结果进行按日期的 group,或者按某个字段 group。
这里用 DSL 还是 Tire?
比如:post : comments = 1: n 的关系
根据 keyword 对 comments 搜索,结果中对 comment 的 created_at.strftime('%Y-%m-%d') 进行 group;然后,再根据 comment 的 post_id 进行 group;
我看了下 DSL 貌似写起来略麻烦,有经验的朋友,请指教!
{
"query": {
"match_all": {}
},
"aggs": {
"by_created_at": {
"terms": {
"field": "created_at",
"format": "yyyy-MM-dd"
},
"aggs": {
"by_post_id": {
"top_hits": {
"sort": [
{
"post_id": {
"order": "desc"
}
}
],
"size": 1
}
}
}
}
}
}
#1 楼 @mimosa 看了下介绍,这个 gem 不错的!
但是我用 DSL 解决了,如果数据量比较大的话,用 DSL 还是 searchkick?
definition = Elasticsearch::DSL::Search.search {
query do
function_score do
query do
filtered do
query do
if keyword.present?
multi_match do
query keyword
operator 'or'
fields %w[ content ]
end
else
match_all
end
end
filter do
range :created_at do
gte start_date
lte end_date
end
end
end
end
end
end
group_types.each do |group_type|
case group_type
when 'date_day'
aggregation :date_day do
date_histogram do
field 'created_at'
interval 'day'
format 'yyyy-MM-dd'
end
end
when 'site_id'
aggregation :site_id do
terms do
field 'site_id'
size 10
end
end
end
end
}
我个人喜欢拼接 json
,用 ES 测试方便。
PS:作者有另一个配合 Searchkick
的 统计界面:https://github.com/ankane/searchjoy Demo:http://searchjoy.herokuapp.com/
靠 ElasticSearch
提供的 Rest API
<- (很多轮子可以选择)
curl -XGET 'http://localhost:9200/_search?pretty=true' -d '
{
"query" : {
"matchAll" : {}
}
}'