ECサイトの検索で0件・少数だった検索語を毎月集めて原因で分類し、同義語辞書と表記ゆれの登録候補を作って商品が見つかるようにする
サイト内検索で結果が0件か数件だった検索語を毎月集め、表記ゆれ・言い換え・誤字・取り扱いなしなどの原因で分類します。辞書で直せるものは同義語辞書に足す行の候補にし、担当者の承認後に反映します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- EC/小売/製造
- 対象部門
- マーケティング
- 対象業務
- 分類・仕分け/台帳・マスタ管理
- 主な課題
- データ分析に時間がかかる/人手が足りない/属人化している
- AIで行う処理
- 分類
- 主な効果
- 品質標準化/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、前月の検索ログからヒット件数が0件と3件以下の検索語を取り出し、検索回数の順に並べる
- 上から順に、商品管理システムで似た名前の商品を探す
- 商品があれば、表記ゆれ・言い換え・誤字のどれかを見て、辞書に足す行を書く
- 商品が無ければ、取り扱いなしとして商品部門への共有シートに書く
- 商品はあるが、検索語の属性(「撥水」「静音」など)が商品ページに無ければ、商品ページの担当へ伝える
- 辞書のファイルを直し、検索の索引に反映する
- 反映後に、足した語で検索して商品が出るかを確かめる
- 自動月初に、前月の検索ログから0件と3件以下の検索語を取り出し、検索回数の順に並べる
- 自動検索語ごとに、条件をゆるめた検索で近い商品の候補を最大10件集める
- 自動検索語と商品の候補を生成AIに渡し、原因を分類させ、辞書に足す行の候補を作らせる
- 自動既存の辞書と照らし、重なる行・矛盾する行に印を付ける
- 自動辞書の候補を足した検証用の索引で、よく検索される語の結果が変わらないかを確かめる
- 人担当者が分類と辞書の候補を一覧で見て、採用・修正・却下を決める
- 自動採用した行を辞書のファイルに足し、パッケージを更新してドメインに反映する
- 自動取り扱いなしは商品部門へ、属性の記載不足は商品ページの担当へ、一覧で送る
- 【自動/人】 翌月の検索ログで、反映した語が0件から抜けたかを確かめる
各工程の詳しい説明を読む
- 月初に、前月の検索ログからヒット件数が0件と3件以下の検索語を取り出し、検索回数の順に並べる
- 上から順に、商品管理システムで似た名前の商品を探す
- 商品があれば、表記ゆれ・言い換え・誤字のどれかを見て、辞書に足す行を書く
- 商品が無ければ、取り扱いなしとして商品部門への共有シートに書く
- 商品はあるが、検索語の属性(「撥水」「静音」など)が商品ページに無ければ、商品ページの担当へ伝える
- 辞書のファイルを直し、検索の索引に反映する
- 反映後に、足した語で検索して商品が出るかを確かめる
(a)上位しか見られない。 0件の検索語は数千種類あり、1語ずつ商品を探していると、上位の数百語で月が終わります。 下位の語は1つずつは少なくても、合わせると検索回数のかなりの部分になります。
(b)原因の見分けが担当者による。 「ブランケット」で0件なら、取り扱いが無いのか、商品名が「ひざかけ」なのか。商品を探し当てられるかどうかは、担当者がその売場をどれだけ知っているかで決まります。 家電に詳しい担当は家電の語を、インテリアに詳しい担当はインテリアの語を、それぞれ多く直します。
(c)足した行が別の検索を壊す。 「マット」と「ラグ」を同じ意味にした翌月、「ヨガマット」の検索にラグが並んだ、ということが起きます。反映後の確認は足した語でしか行っておらず、ほかの語への影響は、お客様からの指摘で初めて分かります。
(d)取り扱いなしの声が商品部門に届かない。 4番の共有シートは書きっぱなしになりがちで、同じ語が何か月も0件のまま上位に残ります。 お客様が探している商品の情報が、品揃えの検討に使われていません。
- 【自動】 月初に、前月の検索ログから0件と3件以下の検索語を取り出し、検索回数の順に並べる
- 【自動】 検索語ごとに、条件をゆるめた検索で近い商品の候補を最大10件集める
- 【自動】 検索語と商品の候補を生成AIに渡し、原因を分類させ、辞書に足す行の候補を作らせる
- 【自動】 既存の辞書と照らし、重なる行・矛盾する行に印を付ける
- 【自動】 辞書の候補を足した検証用の索引で、よく検索される語の結果が変わらないかを確かめる
- 【人】 担当者が分類と辞書の候補を一覧で見て、採用・修正・却下を決める
- 【自動】 採用した行を辞書のファイルに足し、パッケージを更新してドメインに反映する
- 【自動】 取り扱いなしは商品部門へ、属性の記載不足は商品ページの担当へ、一覧で送る
- 【自動/人】 翌月の検索ログで、反映した語が0件から抜けたかを確かめる
5番が、この設計の分かれ目です。 足した行がほかの検索を壊していないかを、担当者が見る前に機械で確かめます。 結果が大きく変わった語がある行には印を付け、担当者はその行を重点的に見ます。
6番で人が見るのは、900語の全部ではなく、辞書に足す行の候補です。 取り扱いなし・属性の記載不足に分類されたものは、一覧で件数と語を流し見て、そのまま各部門へ送ります。
02今回想定するシステム構成
検索ログ(検索語・ヒット件数・日時) ▼【トリガー】月初の定時実行 AWS Lambda ── 0件・3件以下の語を取り出し、回数順に並べる ▼ Amazon OpenSearch Service ── 条件をゆるめた検索で近い商品の候補を集める ▼ Claude API(構造化出力)── 原因の分類と、辞書に足す行の候補 ▼ AWS Lambda ── 既存の辞書との重なり・矛盾を検査 ▼ Amazon OpenSearch Service(検証用の索引)── 候補を足した辞書で上位の語の結果を比べる ▼ 【人】担当者が採用・修正・却下を決める ▼ 同義語辞書のファイル(S3)→ パッケージの更新 → 本番のドメインに反映 └──▶ 取り扱いなし → 商品部門 / 属性の記載不足 → 商品ページの担当
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(同義語のパッケージと kuromoji による日本語の解析) | Azure AI Search、Vertex AI Search(Agent Search) |
| 生成AI | Claude API(構造化出力。原因の分類と辞書の行の候補) | OpenAI API、Gemini API |
| 連携 | AWS Lambda(ログの集計、候補の収集、辞書の検査、パッケージの更新) | AWS Step Functions |
| 保管 | Amazon S3(同義語辞書のファイル、月ごとの候補と判定の記録) | ─ |
検索のしくみと商品データは、置き換えません。 この構成が触るのは同義語辞書のファイルだけで、商品管理システムには書き込みません。最初の準備作業は、検索ログにヒット件数を残すことです。 検索語だけが残っていて件数が無いと、0件の語を取り出せません。
同義語辞書は、パッケージとして扱います。 Amazon OpenSearch Service では、同義語やストップワードの辞書ファイルを S3 に置き、パッケージとして取り込んでドメインに関連付けると、synonyms_path に analyzers/<パッケージのID> を指定して使えます。S3 のファイルを差し替えただけではドメインの辞書は変わらず、パッケージを更新し、ドメインに更新を適用する手順が要ります。
辞書を索引の作り直しなしで差し替えるには、検索側の解析器にだけ使います。 ドキュメントでは、トークンフィルタの updateable: true は検索の解析器にだけ適用され、OpenSearch または Elasticsearch 7.8 以降で、updateable を付けた検索の解析器だけを使っていれば、パッケージの更新の後は自動で索引に反映されるとされています。索引の解析器に使った場合や updateable を付けなかった場合は、索引を閉じて開き直すか、作り直しが要ります。毎月更新する辞書なので、検索の解析器に置く設計が前提です。
日本語の解析には、kuromoji を使います。 対応プラグインの一覧では、Japanese (kuromoji) Analysis と ICU Analysis が、ドメインにあらかじめ入っているプラグインとして OpenSearch 1.0 以降に載っています。日本語向けに勧められている Sudachi もありますが、Sudachi の辞書ファイルは関連付け直してもすぐには反映されず、次のブルー/グリーンのデプロイで更新されるとされています。この構成で毎月差し替えるのは同義語のファイルなので、解析器は kuromoji で組みます。
03どうやって実装するのか
処理の起点を決める
月初の定時実行で動かします。 前月の1日から末日までの検索ログを対象にします。毎日動かさないのは、同義語の行は1語ずつではなく、まとまりで判断したほうが矛盾に気づけるからです。 「スマホケース」と「スマホカバー」の行が別の日に別々に足されると、重なりに気づけません。
例外として、セールや新商品の発売の前には、臨時で動かします。 特集ページを出す商品群について、前月の0件の語のうちその売場に関係するものだけを先に処理します。
取り出す条件は2つです。 ヒット件数が0件の語と、1〜3件の語です。少数ヒットの語を入れるのは、0件と同じくらいお客様が困っているからです。 「電気毛布」で探して1件だけ出た場合、残りの電気毛布は商品名が「電気ブランケット」になっていて出ていないことがあります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 検索ログ | 検索語、ヒット件数、日時、検索の後に商品を見たか | サイトの検索ログ(S3 に月ごとに出力) |
| 商品の候補 | 条件をゆるめた検索で出た商品の名前・カテゴリ・商品ID(1語あたり最大10件) | Amazon OpenSearch Service |
| 既存の同義語辞書 | 現在の辞書の全行と、行ごとに足した月・理由(今後の分) | S3 の辞書ファイルと記録 |
| よく検索される語の一覧 | 前月の検索回数の上位1,000語と、そのときの上位10件の商品ID | 検索ログと検証用の索引 |
| 売場の一覧 | カテゴリの階層と、各カテゴリの担当者 | 商品管理システム |
質を決めるのは、商品の候補の集め方です。 生成AIは、渡された候補の中から根拠を探します。候補に正しい商品が入っていなければ、原因を「取り扱いなし」と分類するしかありません。 次の「データの取得方法」で、候補を集める検索を3通りに分けているのはそのためです。
検索ログには、個人を特定できる情報を入れません。 検索語に電話番号や氏名を入れるお客様がまれにいるため、取り出す段階で数字の並びやメールアドレスの形のものを外します。
データの取得方法を決める
検索ログは、検索のたびにサイトのアプリケーションが書き出しているものを使います。 検索語、ヒット件数、日時、その後に商品ページを開いたかを1行にします。ヒット件数は、検索エンジンが返した件数をそのまま書きます。
商品の候補は、本番の検索とは別の条件で集めます。 本番の検索で0件だったのですから、同じ条件で探しても出ません。
| 集め方 | 中身 | 拾えるもの |
|---|---|---|
| 文字の断片での一致 | 商品名を2文字ずつの断片にした項目で探す | 表記ゆれ、長音や中黒の違い、型番の区切りの違い |
| あいまい一致 | 1〜2文字の違いを許して探す | 誤字、入力の打ち間違い |
| カテゴリ名・説明文での一致 | 商品名ではなく、カテゴリ名と説明文で探す | 言い換え(「ひざかけ」と「ブランケット」など) |
3つの集め方で出た商品を合わせ、1語あたり最大10件を候補にします。 どの集め方で出たかも候補に付けて渡します。表記ゆれは断片の一致で、言い換えは説明文の一致で出ることが多く、どの集め方で出たかが分類の手がかりになります。
文字の断片の項目は、候補を集めるための検証用の索引にだけ持たせます。 本番の索引に足すと、本番の検索の結果まで変わります。
AIへ渡す前に整形する
- ログの整理 … 前後の空白を取り、全角と半角、大文字と小文字をそろえてから同じ語をまとめます
- 個人情報らしい語の除外 … 数字が8けた以上続くもの、メールアドレスの形のものを外します
- ボットの除外 … 同じ時刻に同じ語が大量に出ているもの、意味の無い文字列を外します
- 件数での絞り込み … 0件の語と1〜3件の語を、それぞれ検索回数の順に並べ、上位を対象にします
- 既存の辞書との照合 … すでに辞書にある語は、辞書の行が効いていない理由を別に調べるため、印を付けます
- 候補の収集 … 3つの集め方で商品の候補を集めます
- 候補が0件の語の扱い … 3つの集め方でも1件も出ない語は、生成AIに渡さず「候補なし」として一覧に残します
5番目を省かないでください。 辞書にあるのに0件の語は、辞書の行の書き方が誤っているか、解析器の設定でその行が効いていないことを示しています。新しい行を足しても直りません。
7番目で生成AIに渡さないのは、根拠の無い分類を作らせないためです。 候補が無いと、生成AIは一般的な知識から「言い換え」と分類し、自社が扱っていない商品名を辞書の候補に書くことがあります。
AIに処理させる
させるのは、検索語ごとに、渡された商品の候補を根拠にして原因を1つ選び、辞書で直せるものについて辞書に足す行の候補を作ることです。
| 分類 | 意味 | 送り先 |
|---|---|---|
variant | 表記ゆれ(カタカナとひらがな、長音、中黒、略し方) | 辞書の候補 |
synonym | 言い換え(同じ物を別の言葉で呼んでいる) | 辞書の候補 |
typo | 誤字・打ち間違い | 辞書の候補(片方向) |
model_number | 型番の書き方の違い(ハイフンや空白の有無) | 辞書の候補 |
attribute_missing | 商品はあるが、検索語の属性が商品データに書かれていない | 商品ページの担当 |
not_carried | 候補の中に該当する商品が無い | 商品部門 |
too_broad | 「収納」のように広すぎて、言い換えで結ぶと結果が崩れる | 却下(記録のみ) |
unclear | 判断できない | 担当者 |
辞書の行は、同じ意味として扱う形(a, b, c)と、片方向に置き換える形(a => b)を使い分けさせます。 誤字は片方向です。「ふとn => 布団」は要っても、逆向きの行は要りません。 言い換えでも、意味の範囲が違うものは片方向にします。「ブランケット」で「ひざかけ」を出すのはよくても、「ひざかけ」で大判のブランケットまで出す必要はありません。
| させないこと | 理由 |
|---|---|
| 候補に無い商品名を書く | 自社が扱っていない言葉を辞書に入れると、別の商品が出る |
| 広い語を言い換えで結ぶ | 「ケース」と「カバー」のような行は、何百もの検索を変える |
| 取り扱いなしを言い換えで埋める | 0件は消えるが、お客様は探していない商品を見せられる |
| 商品データの書き換え | 属性の記載不足は商品ページの担当が直す |
| 辞書への直接の反映 | 採用は担当者が決める |
3行目が、いちばん起きやすい失敗です。 「電動自転車」で0件のサイトに、候補として「自転車用ライト」が出ていると、関係がありそうだという理由で言い換えにします。 候補の商品が、検索語と同じ物かを判断の基準にし、関係がある物では結ばないことを指示に書きます。
指示内容を固定する
あなたはECサイトの検索の担当者を手伝います。
お客様が検索して0件または数件しか出なかった検索語について、
原因を分類し、同義語辞書に足す行の候補を作ってください。
【分類】次の中から1つ選んでください。
- variant ........ 表記ゆれ。候補の商品名と、文字の書き方だけが違う
- synonym ........ 言い換え。候補の商品と同じ物を、別の言葉で呼んでいる
- typo ........... 誤字・打ち間違い。候補の商品名の書き損じ
- model_number ... 型番の書き方の違い(ハイフン・空白・大文字小文字)
- attribute_missing 候補に同じ種類の商品はあるが、検索語の性質
(例:撥水、静音)が商品名・説明文に書かれていない
- not_carried .... 候補の中に、検索語と同じ物が無い
- too_broad ...... 検索語が広すぎ、言い換えで結ぶと多くの検索が変わる
- unclear ........ 判断できない
【厳守事項】
- 判断の根拠は、渡した商品の候補だけにしてください。
一般的な知識で、自社が扱っている商品を想像しないでください。
- 辞書の行に書く言葉は、検索語と、候補の商品名・カテゴリ名に
実際に出てくる言葉だけにしてください。
- 候補の商品が、検索語と「同じ物」のときだけ、variant / synonym /
typo / model_number を選んでください。
関係がある物、一緒に使う物、似た用途の物は not_carried です。
- 誤字は片方向(誤 => 正)にしてください。
- 意味の範囲が違う言い換えは、片方向にしてください。
- 1語だけで意味の広い言葉(例:ケース、カバー、マット、収納)を
同じ意味の行に入れないでください。too_broad にしてください。
- evidence_ids には、判断の根拠にした商品IDを書いてください。
- 迷ったときは unclear にしてください。
【検索語】{query}(前月の検索回数 {count} 回、ヒット件数 {hits} 件)
【商品の候補】{candidates}(商品ID、商品名、カテゴリ、出た集め方)
【この語を含む既存の辞書の行】{existing_rules}
「同じ物のときだけ」を、関係がある物の例まで挙げて書いています。 書かないと、一緒に使う物(「プリンター」と「インク」)や、似た用途の物(「加湿器」と「除湿機」)を言い換えにします。辞書に入れば、検索のたびに別の商品が出ます。
広い語を名指しで禁じているのは、1行の影響が大きいからです。 例として挙げた4語は、どれも商品名の後半に付く語です。これらを含む行は、その語を含む全部の検索に効きます。
出力形式を固定する
構造化出力で、次の形のJSONを受け取ります。
{
"query": "",
"category": "variant | synonym | typo | model_number | attribute_missing | not_carried | too_broad | unclear",
"rule": {
"type": "equivalent | one_way | none",
"line": "",
"terms": []
},
"evidence_ids": [],
"route_to": "dictionary | product_page | merchandising | reviewer",
"note": ""
}
1つ目の理由は、category と route_to で、送り先を機械で分けられることです。 辞書の候補は担当者の一覧へ、attribute_missing は商品ページの担当へ、not_carried は商品部門へ、自動で振り分けます。category は enum で決まった値しか返らないため、分類の名前の書き方のゆれで振り分けが漏れることがありません。
2つ目は、rule.line をそのまま辞書の形式で受け取れることです。 line には スマホケース, スマホカバー, スマートフォンケース や ふとn => 布団 の形で入ります。terms に行の中の語を分けて持たせ、ワークフローがその語が検索語か候補の商品名・カテゴリ名に実際に出てくるかを照らします。 出てこない語が入っていれば、行を却下します。
3つ目は、evidence_ids で担当者の確認が速くなることです。 一覧で根拠の商品を開けば、同じ物かどうかを画像で確かめられます。
構造化出力は、JSON スキーマに沿った応答を制約付きのデコードで保証します。 enum と required が使え、スキーマに合わない応答をやり直す必要がありません。ただし、数値の minimum や文字列の maxLength のような制約は使えないため、terms の数や行の長さはワークフローの側で確かめます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 検索ログ | S3 の読み取り | 前月の検索語とヒット件数 |
| Amazon OpenSearch Service(検証用) | 検索のAPI | 商品の候補の収集と、辞書の候補を足したときの結果の比較 |
| Claude API | API呼び出し(構造化出力) | 原因の分類と辞書の行の候補 |
| 担当者の一覧 | スプレッドシートまたは社内の画面 | 採用・修正・却下の判定 |
| Amazon OpenSearch Service(本番) | パッケージの更新と適用 | 採用した行を足した辞書を反映 |
| 商品部門・商品ページの担当 | 一覧の送付 | 取り扱いなし、属性の記載不足 |
検証用の索引で、反映の前に結果を比べます。 本番と同じ商品データと解析器を持つ索引に、候補を足した辞書を入れ、前月の検索回数の上位1,000語の上位10件の商品が、どれだけ入れ替わるかを数えます。大きく入れ替わる語があれば、その原因になった行に印を付けて担当者の一覧に出します。
本番への反映は、パッケージの更新で行います。 辞書のファイルを S3 に置き直し、パッケージを更新し、ドメインに更新を適用します。関連付けの状態が有効(Active)になるのを待ってから、反映した語で検索して確かめます。
辞書のファイルの大きさにも気をつけます。 ドキュメントでは、辞書ファイルは大きさに比例して Java のヒープを使うとされています。毎月足すだけで消さないと、辞書は大きくなり続けます。
人が確認する
担当者が見るのは、辞書の候補の行です。 900語のうち、辞書の候補になるのは一部で、残りは各部門への一覧と却下の記録です。
- 印の付いた行を先に見る … 検証用の索引で上位の語の結果を大きく変えた行、既存の辞書と重なる・矛盾する行です
- 根拠の商品を開く …
evidence_idsの商品を開き、検索語と同じ物かを確かめます - 同じ意味か片方向かを決める … 意味の範囲が違えば片方向に直します
- 採用・修正・却下を記録する … 却下には理由を付けます
unclearを見る … 担当者が判断し、判断がつかなければ売場の担当に聞きます
1番目を必ず先に見てください。 上位の語の結果を変える行は、採用すれば翌日から何万回もの検索に効きます。 0件の語を1つ直すために、よく使われる検索を崩していないかを確かめます。
目標は、900語をならして1語2分です。 辞書の候補は根拠の商品を開いて見るので数分かかり、各部門への一覧と却下は流し見で数秒です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 3つの集め方でも候補が0件 | 生成AIに渡さず「候補なし」。件数が多ければ商品部門へ |
| 辞書の行に、検索語と候補に無い語が入った | 行を却下し、unclear として担当者へ |
| 既存の辞書の行と矛盾する | 両方の行を並べて担当者へ。既存の行を自動で消さない |
| すでに辞書にあるのに0件 | 解析器の設定と行の書き方を調べる。新しい行は足さない |
| 検証用の索引で上位の語の結果が大きく変わる | 印を付けて担当者へ。採用は担当者の判断 |
| パッケージの更新が失敗する | 本番の辞書は前の版のまま。失敗した版の行を記録に残し、翌日にやり直す |
| 検索語に個人情報らしいものが入っていた | 取り出しの段階で除外。記録にも残さない |
| 生成AIが応答しない・拒否した | その語を「未処理」として翌月に回す |
3行目で既存の行を自動で消さないのは、行の理由が残っていないからです。 古い行にも、当時の売場の事情があったかもしれません。消すのは担当者が理由を確かめてからにします。 今後足す行には、足した月と理由を必ず記録します。
記録を残す
- 月ごとに取り出した検索語と、検索回数・ヒット件数
- 検索語ごとの商品の候補と、どの集め方で出たか
- 生成AIの分類と辞書の行の候補(応答の全文)
- 検証用の索引での比較の結果(上位1,000語のうち、上位10件が入れ替わった語と入れ替わりの数)
- 担当者の判定(採用・修正・却下と、却下の理由)
- 辞書のファイルの版と、行ごとに足した月・理由・根拠の商品ID
- 反映した語の、翌月のヒット件数
6つ目で行ごとに理由を残すのが、3年後に効きます。 今の辞書の約3,000行は、理由が無いために消せない行です。理由と根拠の商品IDがあれば、その商品の取り扱いが終わったときに、関係する行を洗い出せます。
最後の行で、反映した語が0件から抜けたかを見ます。 抜けていなければ、行の書き方か解析器の設定に原因があります。
04実装レベルの3段階
半自動化で、1語6分が3分程度になります。 商品を探すところと分類は自動になりますが、辞書のファイルを直して反映し、ほかの語への影響を確かめる作業が残ります。 本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、反映の前の比較を、人が検索し直さずに済むようになるからです。 段階を飛ばさないでください。 半自動化で2か月ほど分類の一覧を見ると、どの売場で0件が多いか、どの集め方で候補が出やすいかが分かります。そこで集め方を直してから比較と反映を自動にするほうが、印の付く行が減ります。
05工数削減シミュレーション
導入後 900件 × 2分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 日用品・家電・インテリア・アパレルなど数万点以上の商品を扱い、サイト内検索を Amazon OpenSearch Service で動かしているEC事業者・小売のネット通販部門・メーカー直販サイト。検索ログに検索語とヒット件数が残っており、0件の検索語が毎月数千種類出ているのに、同義語の登録が担当者の手作業で追いついていない場合。
- 商品数が数百点で、検索よりカテゴリから選ばれることが多いサイト。サイト内検索を外部のSaaSに任せていて、同義語辞書を自社で持てない場合。検索ログにヒット件数が残っておらず、0件の検索語を取り出せない場合。なお、どの言い換えを同じ意味として扱うかと、取り扱いの無い商品を品揃えに加えるかは、担当者と商品部門が決めます。
07最小構成で試す方法
- 前月の検索ログから、0件の検索語を検索回数の順に50語取り出す
- 50語それぞれについて、担当者が商品管理システムで近い商品を探し、名前を5件ずつ書き出す
- 検索語と商品の名前を、手元のAIサービスに貼り付ける
- 「この検索語の原因を、表記ゆれ・言い換え・誤字・型番・属性の記載不足・取り扱いなし・広すぎる・判断できない から1つ選び、辞書で直せるものは同義語辞書の行を書いてください。商品の候補に無い言葉は使わないでください」と指示する
- 出てきた分類と行を、担当者が自分で判断した結果と突き合わせる
2番目で、担当者が商品を探すところは手作業のままにします。 最小構成で確かめたいのは、商品の候補があれば分類と行の候補が作れるかです。候補を集める検索は、半自動化の段階で作ります。
| 出てきた内容 | 判断 |
|---|---|
| 担当者と同じ分類が、根拠の商品付きで出た | 候補の収集と検証用の索引の構築に進む |
| 関係がある物を言い換えにした | 指示の書き方で直る。構成は有効 |
| 担当者が探した商品の候補が的外れで、分類がほとんど「取り扱いなし」 | 候補の集め方が先。 AIの問題ではない |
3行目の結果は、最小構成でもよく出ます。 担当者でも、知らない売場の商品は探し当てられません。その場合は、カテゴリ名と説明文での一致を先に試してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 関係がある物を言い換えにする | 「同じ物のときだけ」を例付きで指示し、根拠の商品を人が開く |
| 広い語の行がほかの検索を壊す | 検証用の索引で上位1,000語の結果を比べ、大きく変わる行に印を付ける |
| 取り扱いなしを言い換えで埋める | not_carried を商品部門へ送り、辞書には入れない |
| 候補に正しい商品が出ない | 断片・あいまい・説明文の3通りで集める |
| S3 のファイルを変えたのに反映されない | パッケージを更新し、ドメインに更新を適用する |
| 更新が自動で索引に反映されない | updateable: true は検索の解析器だけ。索引の解析器に使っていれば閉じて開くか作り直す |
| Sudachi の辞書を毎月差し替えようとする | 関連付け直しはすぐ反映されない。同義語は kuromoji の構成で差し替える |
| 辞書が大きくなり続ける | 行ごとに理由と根拠の商品IDを残し、取り扱いの終わった商品の行を見直す |
| 辞書にあるのに0件の語に行を足す | 既存の行が効いていない原因を先に調べる |
| 検索語に個人情報が入る | 取り出しの段階で数字の並びとメールアドレスの形を外す |
上の3行が、この構成の失敗のほとんどです。 どれも、0件を消すことを目的にしてしまうと起きます。 目的は0件を消すことではなく、探している商品にたどり着けるようにすることです。
5行目と6行目は、最初の反映で必ず一度は迷います。 「辞書を直したのに効かない」の原因は、たいていこのどちらかです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様の検索語、ヒット件数、商品データ(公開している商品名・カテゴリ・説明文)、同義語辞書です。検索語は匿名で扱い、会員IDとは結びつけません。
- 検索語から個人情報を外す … 検索窓に電話番号や氏名を入れるお客様がいます。取り出しの段階で外し、生成AIにも記録にも渡しません
- 会員の情報と結びつけない … この構成に要るのは検索語と回数だけです。誰が検索したかは使いません
- 辞書への反映を人が決める … 辞書の1行は、多くの検索の結果を変えます。採用は担当者が決め、自動で反映しません
- ほかの事業者の商標を言い換えに入れない … 他社のブランド名で検索したお客様に、自社の商品を言い換えで出す行は作りません。ブランド名は
not_carriedとして扱い、行の候補から外します - 取り扱いなしの情報を品揃えの判断にそのまま使わない … 0件の語は需要の手がかりですが、検索回数は需要そのものではありません。品揃えに加えるかは商品部門が判断します
誤りが起きた場合のリスクは、関係の無い商品を出してお客様を迷わせることと、よく使われる検索を崩すことの2つです。 前者は「同じ物のときだけ」の指示と根拠の確認で、後者は反映前の比較で防ぎます。どちらも、反映の前に止められる設計にしてあります。
10まず何から始めるか
1週目:検索ログを確かめる
検索ログに、検索語とヒット件数が残っているかを確かめます。残っていなければ、サイトのアプリケーションで書き出すようにします。あわせて、今の索引で同義語辞書を検索の解析器と索引の解析器のどちらで使っているかを確かめます。
2週目:50語で試す
前月の0件の語から50語を選び、担当者が探した商品の名前と一緒に手元のAIサービスで分類させます。関係がある物を言い換えにしていないか、取り扱いなしを埋めていないかを最優先で見ます。
3週目:辞書の行に理由を付ける
今の辞書の約3,000行のうち、件数の多い売場の行から、足した理由が分かるものに理由を書き足します。 分からない行は印を付けておきます。あわせて、商品部門と商品ページの担当に、一覧を送る形を相談します。
4週目:候補の収集を作る
検証用の索引に文字の断片の項目を持たせ、3つの集め方で候補を集めるところまで作ります。この時点では分類を一覧に出すだけで、辞書は手で直します。
2か月目: 検証用の索引での比較を足し、印の付く行を担当者が重点的に見る流れにします。3か月目以降: パッケージの更新と各部門への送付を自動にし、1語6分が何分になったかを実測します。反映した語が翌月に0件から抜けたかを毎月見て、抜けない語の原因を直す流れが回った時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
同義語・ストップワードの辞書ファイルを S3 から取り込んでパッケージにし、ドメインに関連付けて synonyms_path に analyzers/<ID> で使えること。updateable: true が検索の解析器にだけ適用されること。S3 のファイルを差し替えても自動では更新されず、パッケージの更新と適用が要ること。OpenSearch または Elasticsearch 7.8 以降で updateable 付きの検索の解析器だけなら自動で反映され、それ以外は閉じて開くか作り直しが要ること。辞書ファイルが大きさに比例して Java のヒープを使うこと。Sudachi の辞書が関連付け直しですぐ反映されないこと | Amazon OpenSearch Service: Importing and managing packages | 2026-10-06 |
| ドメインにあらかじめ入っているプラグインの一覧に、Japanese (kuromoji) Analysis と ICU Analysis が OpenSearch 1.0 以降として載っていること。Sudachi Analysis が日本語向けに勧められていること | Amazon OpenSearch Service: Plugins by engine version | 2026-10-06 |
synonym_graph が synonyms と synonyms_path のどちらかで規則を受け取り、Solr の形式(既定)でカンマ区切りの同じ意味の行と => の置き換えの行を書けること。expand の既定が true、lenient の既定が false であること。複数の語からなる同義語に対応すること | OpenSearch Documentation: Synonym graph token filter | 2026-10-06 |
構造化出力が制約付きのデコードで JSON スキーマに沿った応答を保証すること。output_config.format で指定すること。enum・required が使え、minimum・maximum・minLength・maxLength が使えないこと | Claude Docs: Structured outputs | 2026-10-06 |
どの言い換えを同じ意味として扱うか、取り扱いの無い商品を品揃えに加えるかは、担当者と商品部門で決めてください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0607)についてのご相談はこちらから。
