Elastic Cloud ServerlessでKuromojiが使えることを確認しました

# はじめに
今月2024年12月についにElastic Cloud ServerlessがGAになりました。
気になる検索における日本語の形態素解析の利用可否ですが、Kuromojiプラグインがサポートされています。（こちら、ドキュメントには近いうちに明記されるはずです）
(ただし、カスタムプラグインの利用はできないことが[ドキュメント](https://www.elastic.co/guide/en/serverless/current/elasticsearch-differences.html#elasticsearch-differences-serverless-feature-unavailable)に記載されています。）

本記事では、KuromojiプラグインがServerlessで使える様子を記します。

# （従来からある）Elastic Cloud Hostedの場合
従来からのElastic Cloud Hostedの場合の動作をまず確認し、その後Serverlessで同じ結果となることを確認したいと思います。

Hostedの場合、Elatic Cloudのデプロイメントの設定画面から以下のようにanalysis-kuromojiを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/96f8d218-a655-3fa8-76c9-9ff5c213a5cc.png)

その後、以下の簡単なKuromojiを使うIndexを作成し、テストデータを1件投入します。
```
PUT /japanese_index
{
  "settings": {
    "index": {
    "analysis": {
      "analyzer": {
        "kuromoji_analyzer": {
          "tokenizer": "kuromoji_tokenizer",
          "filter": [
            "kuromoji_baseform",
            "kuromoji_part_of_speech",
            "ja_stop"
          ]
        }
      }
    }
    }
  }
}

PUT /japanese_index/_mapping
{
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "kuromoji_analyzer"
      }
    }
}

POST /japanese_index/_doc
{
  "content": "東京都に行きました。"
}

POST /japanese_index/_analyze
{
  "analyzer": "kuromoji_analyzer",
  "text": "東京都に行きました。"
}
```

"東京都"で検索するとヒットします。
```
GET /japanese_index/_search
{
  "query": {
    "match": {
      "content": "東京都"
    }
  }
}

結果
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "japanese_index",
        "_id": "f_R7-5MBQGL-gt3N-cE2",
        "_score": 0.5753642,
        "_source": {
          "content": "東京都に行きました。"
        }
      }
    ]
  }
}
```


"東都"で検索するとヒットしません。
```
GET /japanese_index/_search
{
  "query": {
    "match": {
      "content": "東都"
    }
  }
}

結果
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 0,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  }
}
```

参考までに、Kuromojiを使っていないIndexの場合は、"東都"でもヒットしてしまいます。（"東京都"もヒットはします）
```
GET /english_index/_search
{
  "query": {
    "match": {
      "content": "東都"
    }
  }
}

結果
{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "english_index",
        "_id": "nvSG-5MBQGL-gt3NBfx9",
        "_score": 0.5753642,
        "_source": {
          "content": "東京都に行きました。"
        }
      }
    ]
  }
}
```


# （新）Elastic Cloud Serverlessの場合
Serverlessの場合、プラグインの有効化はユーザー側で操作はできませんが、KuromojiとICUは有効済となっています。

そのままAPIからKuromojiを使うことができました。さきほどと同様のAPIを入れた結果、検索結果も同じ結果であることが確認できました。

"東京都"でヒット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/684f6eac-29f5-d936-5047-7b76718e2e41.png)

"東都"でヒットしない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/4335cfe8-6adb-1107-c141-3d865115124f.png)

# おわり
Elastic Cloud ServerlessでKuromojiが使えることを確認しました！