こんにちは、検索基盤部 検索基盤ブロックの渡です。私は検索基盤ブロックで、主にZOZOTOWNの検索周りのシステム開発に従事しています。
以前の記事では、Elasticsearchのマッピング設定の最適化について取り上げました。そして、今回は日本語による形態素解析を実現するまでの手順をご紹介します。

Elasticsearchのマッピング設定最適化によるインデキシングパフォーマンス改善への取り組み - ZOZO TECH BLOG
はじめに
ZOZOTOWNの検索機能では、Elasticsearchを利用しています。現在では検索機能の全般でElasticsearchを利用していますが、リリース当初はキーワード検索を実現するために採用していました。そのため、全文検索を実現するためのマッピング定義やAnalyzerを理解する必要がありました。
Elasticsearchで全文検索を実現させる手順
- Elasticsearchの環境準備
- マッピングの定義どのようにデータを格納するかを決める
・どのようにデータを格納するかを決める - Analyzerの定義どのように分割するか(検索でヒットさせるか)を決める
・どのように分割するか(検索でヒットさせるか)を決める - データの投入
- 検索
本記事では、2. と 3. を取り扱います。
全文検索のためのマッピング定義
ドキュメント内の各フィールドのデータ構造やデータ型を記述した情報のことをマッピングと呼びます。

Mapping | Elasticsearch Guide [7.15] | Elastic
下記はマッピング定義の例です。
PUT /sample_index
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}また、文字列をフィールドに格納するためのデータ型には下記の2種類が存在します。全文検索では、文章から特定の文字列を検索することを指すため、前者のtext型のフィールドを使用します。
- text型
Analyzerによる単語の分割が行われ、転置インデックスが形成される - keyword型
Analyzerによる単語の分割が行われず、原形のまま転置インデックスが形成される
Analyzerの構造
全文検索するために文章を単語の単位に分割する処理機能をAnalyzerと呼びます。
下記はマッピング定義の例です。
なお、Elasticsearchがデフォルトで提供するAnalyzerは公式ドキュメントで参照可能です。

Built-in analyzer reference | Elasticsearch Guide [7.15] | Elastic
PUT sample_index
{
"mappings": {
"properties": {
"goods_name":{
"type": "text",
"analyzer": "standard"
}
}
}
}そして、Analyzerは3つの処理ブロックから構成されています。
- Character filters
1文字単位の変換処理 - Tokenizer
トークン(単語)に分割する処理 - Token filters
各トークンに対する変換処理
上記の処理を用い、Analyzerは下記の流れで変換処理を行います。
続きはこちら