Go言語でElasticSearch用のwrapper, goesでbool should methodを利用する。

こんにちは yoshi です。
このブログのフォントが若干変わりました。

GO言語は学習コストが低く、rubyやpythonなどのLL言語を触ったことがあると習得しやすいというメリットがあります。
でもこういう書き方あったのか!ということがあったので備忘録として書き留めておきます。

ElasticSearchでのqueryの書き方として以下のようなものが挙げられます。

# elastic search
{
  "query": {
    "match": {
      "user_id_1": "438018"
    }
  }
}

これはuser_id_1438018に一致するものを取り出すqueryです。

これを goes を使って書くと

# search.go
var query = map[string]interface{}{  
        "query": map[string]interface{}{
            "match": map[string]interface{}{
                "user_id_1": "438018",
            },
        },
    }

となります。

さて、 A or B のような検索をしたいとき、つまり和集合の検索をしたいときにはbool shouldを使います。

# elastic search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "year": "2016"
          }
        },
        {
          "match": {
            "frequency": "7"
          }
        }
      ]
    }
  }
}

これはyear2016でマッチするものか、frequency7でマッチするものを取得します。
これをGOで書くと

# search.go
var query = map[string]interface{}{  
        "query": map[string]interface{}{
            "bool": map[string]interface{}{
                "should": []map[string]interface{}{
                    map[string]interface{}{
                        "match": map[string]interface{}{
                              "year": "2016",
                          },
                    },
                    map[string]interface{}{
                        "match": map[string]interface{}{
                              "frequency": "7",
                          },
                    },
                },
            },
        },
    }

となります。 "should": []map[string]interface{}がarray mappingで複数mapされたものを格納できるスライスです。

こうするといい感じに値が取り出せるようになります。