図解でわかるような気がする検索システム

こんにちは。データソリューションスタジオの西尾です。
今回は検索システムの大まかな流れについて、初めて検索システムに触る方に向けてわかりやすくご紹介できたらと思います！

:::note warn
この記事は、[Supershipグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/supership)の17日目の記事になります。
:::

# 検索システムって何？
**ある目的に合致する情報やデータを一定の手順や方法で探し出すシステム**となります。
例えば、有名人について調べたいとき、皆さんがよく使うブラウザから有名人についてのwebページを検索したりしないでしょうか？
このように、より噛み砕くと**何か探したい情報・データを探してくれるシステム**になりそうです。

# 専門用語 ドキュメント・キーワード・インデックス
ここではいくつかの専門用語が出てきます。大きく三つです。
#### ドキュメント
webサイトの文章や商品情報などの**検索対象のデータ**として考えてほしいです。
#### キーワード
索引で扱う単語という意味で扱っています。**ドキュメントを解析した後で出現している単語**のことをキーワードとしています。
#### インデックス
**ドキュメントを検索システムのデータベースに保存して検索できるようにする状態**を示しています。
索引を作成してキーワードからドキュメントを検索できるようにする状態と考えてもらえればと思います。


# 検索システムの種類
検索の方法にも大きく２つあり。逐次検索と索引検索が挙げられます。

![スクリーンショット 2023-12-14 17.46.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/e4f58cc7-8bb9-f566-d1cc-ee8eafd123f8.png)
#### 逐次検索
* ドキュメントを先頭から順に見て、検索したい単語と一致するドキュメントを探す方法です。
* シンプルな検索方法ではあり、ドキュメントの量が少なければ問題はありませんが、莫大なドキュメントの量だと検索に時間がかかってしまう。

#### 索引検索
* あらかじめ索引を作っておき、検索時に索引からドキュメントを探す方法です。
* 逐次検索よりも早い検索が可能であり、検索システムではこちらの方法が使われることが多いです。問題点として索引の作成に時間がかかる点があります。

逐次検索に対して索引検索の検索スピードや柔軟性が評価されて検索システムには索引検索が利用されることが多いです。
索引検索を含めて検索システムでどのように検索できるようになるかを説明していきます。

# 検索システムの全体
![スクリーンショット 2023-12-16 23.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/9d22d193-6457-ed90-7b54-f15113a2ddef.png)

検索システムの区分としては**①ドキュメントの解析と登録を行い、②インデックスとしてドキュメントを保存し、③検索を行う**の大きく３つあります。
エンジニアの方はそれぞれの機能について開発・運用・チューニングを行い、日々の検索結果を改善しています。

# 検索システムの流れ
![スクリーンショット 2023-12-16 23.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/87dcb02f-03c7-56e6-da7e-7209ffd1546b.png)

流れとしては
1. ドキュメントの解析を行い索引のためのキーワードを取得を行う。
3. キーワードとドキュメントをインデックスとしてデータベースに保存する。
3. 検索者（ユーザー）がデータベースに検索を行い、検索結果が返ってくる。

の三つの流れに沿って検索システムは動いています。
なので大きく分けると、前半の検索システムの作成と、後半の検索システムで検索を行うのが基本になります。

まず前半の検索システムの作成について説明します。

# ドキュメントの解析とキーワード取得
ここでは**ドキュメントを解析してキーワードを取得する流れ**を説明します。
ドキュメントとして登録される物には文字や数字以外にも文章などもあります。
特に文章の検索を行う際に必要になってくるのですが、どのように文章からキーワードを取り出すのでしょうか？
![スクリーンショット 2023-12-16 23.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/68fcc956-c2d1-3fbf-5040-51b36d09e4ce.png)


解析と取得には以下の３つの流れがあり、それぞの具体的に何をしているかというと
1. ドキュメントの正規化。例では　「、」や「。」などのキーワードに不必要な単語を排除しています。
2. ドキュメントをキーワード単位に分割。例では日本語の単位ごとに分割しています。
3. キーワードそれぞれに加工。例ではキーワードに相応しくない「から」「に」「で」を削除したり「新横浜駅」を１単語ごとに分割したりしています。

このように解析と取得を行なっています。以上は一例に過ぎず、漢字をひらがなやローマ字にしたり、分割の手法も多くあります。

# インデックスとしてデータベースに登録する
![スクリーンショット 2023-12-16 23.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/7986c9aa-d2bb-79a0-3d62-825f007a4e92.png)

ドキュメントをインデックスとして登録する部分で大きく二つ流れがあります
1. 特定ドキュメントと特定ドキュメントに紐づけられたIDを保存します。
2. ドキュメントで解析・取得したキーワードとキーワードが出現するドキュメントのID群を保存します。

特に２に関して具体例を含めて説明します。
1. **ドキュメントを解析・取得したキーワードを取得します。**
   例では横浜駅から「横浜」と「駅」の２キーワードを取得しました。
2. **キーワードをドキュメントのID群と保存します**。
  　例では「横浜」というキーワードはドキュメントの「横浜駅」だけでなく「新横浜駅」や「横市営地下鉄」のキーワードとしてあるため、３つのIDとキーワード「横浜」が保存されます。
**キーワードは一つだけのドキュメントだけでなく、複数の他のドキュメントにも存在することがあります。
キーワードをどのドキュメントで出現するかとして複数のIDを保存することで、特定のキーワードはこのIDのこのドキュメントに出現することがわかるようになります。**

ここまでがドキュメントを登録するまでの流れになります。

# インデックス型データベースに検索を行う
![スクリーンショット 2023-12-16 23.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/a3535833-c80c-f4f5-f01f-bd5d568312e1.png)

ここから検索者(ユーザー)が検索する流れになります。

インデックス型データベースを用いて検索を行います。
検索者が入力した、検索対象の単語が検索システムに送られます。
検索対象の単語に関してキーワードリストで検索を行います。
検索対象の単語と一致するキーワードが見つかると関連づけられているドキュメントのIDがわかります。
そのIDから検索結果の対象になる複数のドキュメントがわかります。
このドキュメントを検索結果として検索者(ユーザー)に返すというのが基本的な流れになります。

# 検索システムの全体と流れのまとめ
![スクリーンショット 2023-12-16 23.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714345/597d1eac-1430-b8f0-7595-b53494ff30db.png)

検索システムについてのまとめです。改めて流れを確認すると、大きく３つの流れです。
1. 解析機能でドキュメントの解析を行い、キーワードの取得を行います。
2. ドキュメントとキーワードをIDに関連付けながら索引できるようにインデックスとしてデータベースに保存する.
3. 検索者が入力した検索対象の単語からキーワードり→ID→ドキュメントの流れで検索を行い、検索結果を返す
の流れになります。

# 検索システムをもっと知りたい・開発したい方へ
以上までがふんわりした感じでの説明になりましたが、より厳密にどう動いているか知りたい方は、以下のサイトや本が参考になると思います。
検索システムであればElasticsearchやopensearchから色々探してみるのがいいじゃないかと思います。

https://dev.classmethod.jp/articles/es-01/

https://gihyo.jp/dev/serial/01/search-engine/0001?summary

https://www.lambdanote.com/collections/ir-system

https://book.impress.co.jp/books/1119101078

https://www.elastic.co/guide/en/elasticsearch/reference/master/index.html 

# おわりに
私が初めて検索システムを触るときに、このような資料あればより検索システムについての理解のとっかかりができたかなと思ったりしています。 
なのでどんどんインプットとアウトプットをしていきたいなと思っています！
またこのように図解にしていくと私自身も検索の流れというものがよくわかってくるように感じます。
他の記事としてサジェスト(オートコンプリート)について記事にできればと思います！

:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::