一般社団法人 全国個人事業主支援協会

COLUMN コラム

仕事で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と相性が悪くて結果を取るのが一苦労でした…。
気が向けばいずれ書きます。

The following two tabs change content below.

宮山龍太郎

PADI RED、Tec40、PADIスノーケルガイド、プレーパーク活動など。 2020年8月現在、平日フルタイムのリモートワーク、開発マネージャー以外に週末スノーゲルガイドの見習いアシスタントとしても海で活動しています。

最新記事 by 宮山龍太郎 (全て見る)

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア