仕事でElasticSearchをやり始めました。
Web、IT系の開発経験は長いですが、実はElasticSearchを触るのは初めてだったりします。
以前その手のをやっていた時はAlgoriaに丸投げしていた上にマネージャーでソースコードを触る暇もない立場だったのとそれより前はGoogle App Engineで自前でSearch API使っていたとかでありそうで有りませんでした。
さて、今回やりたいことはSQLで言うGroup Byで数を数えるというのものです。
今回でいうとある地方の正社員の数を数えたいと言う要件になります。
結論から言うと filter match_phraseを使います。
リクエストJSONは以下のような感じ(Wordpressの設定でインデントが消されてしまって見づらくなってます、すいません)
GET job/_search
{
"query": {
"bool": {
"filter": [
{
"terms": {
"location.id": [
"10000"
]
}
},
{
"terms": {
"branchType": [
"IS_OK"
]
}
}
]
}
},
"size": 0,
"aggs": {
"groupByBranchTypes": {
"terms": {
"field": "branchType",
"size": 1
},
"aggs": {
"GROUP01": {
"filter": {
"match_phrase": {
"searchContentTriGram": {
"query": "正社員"
}
}
}
}
}
}
}
}
上記のRequestの結果はこちら
{
"took" : 18,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 81,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"groupByBranch" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "正社員",
"doc_count" : 81,
"GROUP01" : {
"doc_count" : 10
}
}
]
}
}
}
最後の
"GROUP01" : {"doc_count" : 10}
がその正社員の数になります。
ただし、ElasticSearchの検索件数は分散システムのため大雑把な数字を出すと言われているので分散構成にしていると参考程度のものになるかもしれません。
今回はElasticSearchをElastic4Sと言うScalaのライブラリを使って書きましたが、この検索結果と型システムのきついScalaと相性が悪くて結果を取るのが一苦労でした…。
気が向けばいずれ書きます。