App SearchのElasticsearch index-baesdエンジンの日本語検索を試してみた

# はじめに
Elastic v8.5でGAになったApp SearchのElasticsearch index-baesdエンジンについての現状について調べてみました。
Elastic Cloudのv8.5.0デプロイメントで試しています。


App Searchは簡単に言うと検索エクスペリエンスを可視化したり、GUIベースで検索エンジンをチューニング、カスタマイズすることができるElasticの機能です。もう少し詳しく知りたい場合、他の方が書いた以下の記事を参照してみてください。

セルフマネージド版のElastic App Searchを試してみた
https://qiita.com/tike/items/dc1ed4d0734080a00376

# App SearchのElasticsearch index-baesdエンジンについて
これまではApp Searchのインデックスは普通のElasticsearchインデックスとは扱いが異なる、App Searchマネージドなインデックスでした。例えば既存のElasticsearchインデックスに対してApp Search機能を使う、といったことが今までできませんでした。この課題を解消するのがElasticsearch index-baesdであり、[v8.5.0でGAとなりました](https://www.elastic.co/guide/en/enterprise-search/8.5/release-notes-8.5.0.html)。

# 検証のための事前のセットアップ
今回は日本語全文検索について試したいので、以下のブログにあるインデックスをそのまま再利用してインデックスを構築しました。
https://www.elastic.co/jp/blog/how-to-implement-japanese-full-text-search-in-elasticsearch

詳しい手順はブログの通りでここでは省略しますが、以下のようにmy_fulltext_searchインデックスのmy_fieldに日本語テキストのデータを入れています。
```
POST _bulk
{"index": {"_index": "my_fulltext_search", "_id": 1}}
{"my_field": "アメリカ"}
{"index": {"_index": "my_fulltext_search", "_id": 2}}
{"my_field": "米国"}
{"index": {"_index": "my_fulltext_search", "_id": 3}}
{"my_field": "アメリカの大学"}
{"index": {"_index": "my_fulltext_search", "_id": 4}}
{"my_field": "東京大学"}
{"index": {"_index": "my_fulltext_search", "_id": 5}}
{"my_field": "帝京大学"}
{"index": {"_index": "my_fulltext_search", "_id": 6}}
{"my_field": "東京で夢の大学生活"}
{"index": {"_index": "my_fulltext_search", "_id": 7}}
{"my_field": "東京大学で夢の生活"}
{"index": {"_index": "my_fulltext_search", "_id": 8}}
{"my_field": "東大で夢の生活"}
{"index": {"_index": "my_fulltext_search", "_id": 9}}
{"my_field": "首都圏の大学　東京"}
```

# Elasticsearch index-baesdエンジンの構築
ではここからApp SearchのElasticsearch index-basedエンジンを作成していきます。App Searchを使い始めるときにコンテンツのエンジンのタイプにて、Elasticsearch index-basedを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/5cab7343-69a1-c5c1-eed1-f8a50437bcb4.png)

任意のEngine nameを設定し、そして検索対象のインデックス名を選択します。（今回はわかりやすくするためにあえてエンジン名に-testをつけて分けましたが、インデックスと同じ名前も可能です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/7e2f27b9-3a1e-36ab-add1-c9a6adf1ae01.png)

エンジン作成後、検索を試すためにSearch UIメニューからサンプルの検索画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/efd2a9f7-1030-170f-2b3b-5c314741a2ea.png)

'東京大学'で検索すると、以前より正確な検索結果となりましたね！
![スクリーンショット 2022-12-09 11.29.34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/2307f8e0-e442-7d8d-f2cf-3220ba3a529f.jpeg)

'東大'での検索も。
![スクリーンショット 2022-12-09 11.29.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/6c67c180-fb9b-7870-4f79-4e2767b23c52.jpeg)

試しに'慶應大学'
![スクリーンショット 2022-12-09 11.30.35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/d780bdab-3f1d-caf2-62fb-ee479dd56f20.jpeg)

# 従来のApp Searchマネージドエンジンではどうなる？
そもそもインデックスとドキュメントの作り方が大きく違い、以下のような感じとなります。見ての通り、日本語アナライザの細かい設定ができません。エンジン作成時にLanguage設定をJapaneseに指定できますが、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/21697590-f035-6733-b725-76676e35c9d3.png)

```
[
{"id":1, "my_field": "アメリカ"},
{"id":2, "my_field": "米国"},
{"id":3, "my_field": "アメリカの大学"},
{"id":4, "my_field": "東京大学"},
{"id":5, "my_field": "帝京大学"},
{"id":6, "my_field": "東京で夢の大学生活"},
{"id":7, "my_field": "東京大学で夢の生活"},
{"id":8, "my_field": "東大で夢の生活"},
{"id":9, "my_field": "首都圏の大学　東京"}
]
```

App Searchマネージドなエンジンだと、エンジンのLanguage設定をJapaneseにしても以下のようにイマイチな結果となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109197/371d28a0-e176-a313-e2be-250a566eb01d.png)

# 最後に 
今回はApp SearchのElasticsearch index-baesdエンジンを検証してみて、日本語の全文検索に対応できそうなところを確認しました。
次回もう少しクライアント側の実装や、App Searchの分析画面でどう見えるかを確認していきたいと思います。