ブログ

セマンティック検索の実装: Elasticsearch を使ったレシピ検索の構築

電子商取引 Web サイトのコンテキストでセマンティック検索を実装します。

はじめに

多くの電子商取引ウェブサイトは、レシピ検索エクスペリエンスを強化することに関心を持っています。セマンティック検索を正しく適用すると、顧客は「バレンタインデー用の何か」や「感謝祭の食事」など、より自然なクエリに基づいて必要な材料をすばやく見つけることができます。

この記事では、Elasticsearch を使用して、このようなクエリをサポートするセマンティック検索を実装する方法を説明します。スーパーマーケットの食材や製品のカタログを保存するためのインデックスを設定し、このインデックスを使用してレシピ検索を改善する方法を説明します。この記事全体を通して、このデータ構造を作成し、自然言語処理技術を適用して顧客の意図に沿った関連性の高い結果を提供する方法について説明します。

この記事で紹介したコードはすべて Python で開発されており、 GitHubで入手できます。リポジトリにアクセスしてソース コードを確認し、必要に応じて調整し、開発環境に直接ソリューションを実装できます。

セマンティック検索の実装を開始

セマンティック検索の実装を開始するには、まず自然言語モデルを定義する必要があります。Elastic は独自のモデルELSERを提供していますが、Hugging Face など、さまざまなプロバイダーの NLP モデルの統合もサポートしています。この柔軟性により、ニーズに最適なオプションを選択できます。

この記事では、NLP モデルの展開と管理の複雑さを軽減するELSERを使用します。さらに、Elastic はsemantic_text機能を提供しており、これによりプロセスが大幅に簡素化されます。semantic_textを使用すると、埋め込み生成プロセス全体が簡単かつ自動化されます。推論ポイントを定義し、インデックス マッピングで埋め込みを受け取るフィールドを指定するだけです。ドキュメントのインデックス作成中に埋め込みが生成され、指定されたフィールドに自動的に関連付けられます。

セットアップ手順

以下は、セマンティック検索をサポートするインデックスを作成する手順です。以下の手順に従うと、インデックスが設定され、セマンティック検索の準備が整います。

  1. 推論ポイント を作成します

  2. インデックスを作成し、埋め込みを受け取ることができるように説明フィールドを semantic_text として設定します。

  3. 製品カタログを保存する食料品カタログ インデックスにデータをインデックスします。このカタログは、ここにあるデータセットから取得されました。

スーパーマーケットにおけるセマンティック検索の応用

食料品店の製品データがインデックスに入力されたので、セマンティック検索を使用して検索結果を改善するためのクエリをテストおよび検証しています。私たちの目標は、コンテキストとユーザーの意図を理解し、より関連性の高い正確な結果を提供する、よりスマートな検索エクスペリエンスを提供することです。

セマンティック検索が解決する課題

製品カタログに基づいて、従来の語彙検索ではしばしば問題となる語彙とコンテキストの問題に対処することで、セマンティック検索が食料品店での検索エクスペリエンスをどのように変革できるかを探ってみましょう。

1. 料理の意図の解釈

問題 01 : 顧客が「グリル用シーフード」を検索する場合、語彙検索システムはクエリの背後にある意図を完全に理解できない可能性があります。グリルに適したシーフード製品をすべて識別できず、製品名に「シーフード」または「グリル」という正確な用語が含まれる製品のみが返される可能性があります。

まず、語彙検索を実行し、結果を分析します。次に、セマンティック検索で同じことを実行し、同じ検索語の結果を比較します。

クエリ語彙検索

 response = client.search(
        index="grocery-catalog",
        size=5,
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "seafood for grilling",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )

結果:

検索タイプ

名前

スコア

語彙

北西部の魚 アラスカ産ベアディズワイガニ

10.453125

語彙

吉田さんのソース オリジナルグルメ

7.2289705

語彙

プレミアムシーフードバラエティパック - 20個

7.1924105

語彙

アメリカ産レッドスナッパー - 丸ごと、頭付き、洗浄済み

6.998647

語彙

ロブスターの爪と腕、持続可能な天然漁獲

6.438654

語彙検索により、American Red Snapper や Northwest Fish Alaskan Bairdi Snow Crab など、グリルに適した魚介類がいくつか返されました。しかし、語彙検索では、シーフードではなくミートソースであるミスターヨシダソースなど、関連性の低い商品がリストの上位に表示され、語彙アルゴリズムが「グリル用」の文脈を完全に理解するのに苦労していることが示唆されました。

セマンティック検索ソリューション

「シーフード」という用語と「グリル」などの調理コンテキストを組み合わせたクエリを使用して、商品名に「グリル」や「シーフード」という単語が直接表示されていない場合でも、グリルに最適な魚の切り身、エビ、ホタテなどの包括的なオプションのリストを返します。これにより、検索結果が顧客の意図にさらに一致するようになります。

クエリセマンティック検索:

es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "seafood for grilling"

       }
   })

検索タイプ

名前

スコア

セマンティック

頭付き、スズキの丸ごと一匹

16.175909

セマンティック

アラスカ産クロタラ(セーブルフィッシュ)

15.855331

セマンティック

アメリカ産レッドスナッパー - 丸ごと、頭付き

15.454779

セマンティック

北西部の魚 アラスカ産ベアディズワイガニ

15.855331

セマンティック

アメリカ産レッドスナッパー - 丸ごと、頭付き

15.3892355

セマンティック検索では、「シーフード」という用語に直接関連する製品が返されるだけでなく、「グリル」というコンテキストも理解し、グリルに適した丸ごとの魚や切り身も表示されました。ここで重要なのは結果の精度であり、これにはグリル料理によく使われるスズキやアラスカ産黒タラなどの丸ごとの魚のオプションも含まれていました。

問題 02 : 多くの顧客は、仕事で長い一日を過ごした後、「平日の簡単な食事」などの用語を使用して、手早く簡単に作れる夕食の解決策を検索します。従来の語彙検索では、手軽な食事という概念を完全には捉えることができず、多くの場合、名前に「簡単」という言葉が含まれる商品のみに焦点が当てられます。

前の問題と同様に、まずは語彙検索を実行します。その後、セマンティック検索を使用したソリューションを適用します。

クエリ語彙検索

 response = client.search(
        index="grocery-catalog",
        size=5,   
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "easy weeknight meals",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )

結果:

検索タイプ

名前

スコア

語彙

Avery イージーピール 住所ラベル 4200枚

8.017723

語彙

Omeals 自己加熱式非常食/携帯食 32

6.592727

語彙

沿岸シーフード キハダマグロの角切りポケ

5.836883

語彙

重量感のある超重量12オンスフォーム

5.8116536

語彙

ヴァニティフェア エブリデイ ナプキン 2枚重ね 110枚入り

5.752989

語彙検索では、Avery Easy Peel Address Labels や Vanity Fair Everyday Napkins など、食事とはまったく関係のないアイテムも含め、関連性の低い結果が返されました。これらの製品は、手早く食事をしたいというユーザーのニーズを満たしていません。語彙検索では確かに 1 つの便利な製品 (Omeals Self Heating Emergency Meals) が返されましたが、ナプキンやラベルなどの他の結果は説明にある「簡単」または「平日の夜」という単語に一致するだけで、素早い食事の解決策を求めるユーザーの意図に真に応えるものではありませんでした。

セマンティック検索ソリューション

手早く簡単に食べられる食事の意図を理解するクエリを実装しました。これは、名前に「簡単」という言葉が明示的に含まれていなくても、調理済みの肉、冷凍パスタ、ミールキットなど、すぐに準備できる製品を関連付けます。このアプローチにより、顧客は平日の夜に素早く夕食をとるのに最適なオプションを見つけられるようになり、利便性のニーズに応えます。

クエリセマンティック検索

es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "easy weeknight meals"

       }
   })

結果:

検索タイプ

名前

スコア

セマンティック

Omeals 自己加熱式非常食/携帯食 32

14.610006

セマンティック

日清カップヌードル、エビ、2.5オンス

13.751424

セマンティック

ナマステ グルテンフリー ワッフル&パンケーキミックス

13.73376

セマンティック

アイダホポテト、ゴールデングリルハッシュブラウンポテト

12.549422

セマンティック

日清 カップヌードル チキン 24個入り

12.034527

セマンティック検索では、インスタントラーメン(カップヌードル)、調理済みのジャガイモ、パンケーキミックスなど、平日の夜に簡単に作れる夕食の典型的な選択肢である、手軽で便利な食事に明確に関連する製品が返されました。これは、セマンティック検索が「平日の夜に簡単に作れる食事」というフレーズの背後にある概念を理解し、手早く簡単に作れる食事を見つけたいというユーザーの意図を捉えることができることを示しています。興味深いことに、「ソーダ」などの他のカテゴリの製品も、コンテキストに関連がある場合(食事に添える飲み物など)に含まれることがあります。

2. 地域用語と語彙のバリエーション

問題: ある顧客が「ソーダ」を検索する一方で、別の顧客は同じ商品を「ポップ」で検索する可能性があります。従来の語彙検索では、両方の用語が同じ項目を指していることを認識できません。

クエリ語彙検索

 response = client.search(
        index="grocery-catalog",
        size=5,
        source_excludes="description_embedding",
        query={
            "multi_match": {
                "query": "refreshing pop drink low sugar",
                "fields": [
                    "name",
                    "description"]
            }
        }
    )

結果:

検索タイプ

名前

スコア

語彙

プライムハイドレーション+スティック 電解質ドリンクミックス

14.492869

語彙

カプリサン、100%ジュース、バラエティパック

12.340851

語彙

ジョイバースト エナジードリンク、フローズンローズ、12

11.839179

語彙

ケロッグのポップタルト、フロステッドブラウンシュガーシナモン

9.97788

語彙

カインド ミニバー バラエティパック 0.7

9.336912

語彙検索は、正確な単語の一致に焦点を当てます。Prime Hydration や Capri Sun などの製品が返される一方で、「pop」という用語との直接一致により、飲み物ではなくスナックである Kellogg's Pop-Tarts など、無関係な結果も表示されました。これは、用語に複数の意味がある場合やあいまいな場合、語彙検索の効果が低下する可能性があることを浮き彫りにしています。

セマンティック検索ソリューション

セマンティッククエリでは、語彙検索では解決できない語彙のバリエーションの問題を克服できます。検索用語を拡張することで、文脈上の意味に基づいた結果を得ることができ、より関連性の高い包括的な回答を提供できます。

クエリ:

es_client.search(
   index="grocery-catalog-elser",
   size=size,
   source_excludes="description_embedding",
   query={
       "semantic": {
           "field": "description_embedding",
           "query": "refreshing pop drink low sugar"

       }
   })

結果:

検索タイプ

名前

スコア

セマンティック

オリポップ 12オンス プレバイオティクスソーダ バラエティ

14.776867

セマンティック

バイ アンチオキシダント ココフュージョン バラエティパック 18個

14.663253

セマンティック

モンスターエナジードリンク、ゼロウルトラ、24

14.486348

セマンティック

ジョイバースト エナジー バラエティ、12液量オンス

14.007214

セマンティック

ジョイバースト エナジードリンク、フローズンローズ、12

13.641038

セマンティック検索では、製品名に「pop」という正確な用語が含まれていない場合でも、「soda」の同義語として「pop」の概念に直接一致する製品 (Olipop Prebiotics Soda など) が返されます。検索では、ユーザーの意図(爽やかな低糖飲料)を理解し、プレバイオティクスソーダ(Olipop)や無糖エナジードリンク(Monster Energy Drink)などのオプションを含む関連商品を返すことができました。

まとめ

食料品店のコンテキストでセマンティック検索を実装すると、「グリル用の魚介類」や「平日の簡単な食事」などの複雑なクエリを理解するのに非常に効果的であることが証明されています。このアプローチにより、ユーザーの意図をより正確に解釈し、関連性の高い商品を返すことができました。

Elasticsearch を使用し、ELSER でプロセスを簡素化することで、セマンティック検索を迅速かつ効率的に適用し、検索結果を大幅に改善し、より機敏でターゲットを絞ったショッピング体験を提供できるようになりました。これにより、検索プロセスが最適化されるだけでなく、顧客に提供される結果の関連性も高まりました。

参照資料

モデル ELSER:

https://www.elastic.co/guide/en/elasticsearch/reference/current/put-inference-api.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-elser.html

意味テキスト:

https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-text.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html

データセット:

https://www.kaggle.com/datasets/bhavikjikadara/grocery-store-dataset?select=GroceryDataset.csv

セマンティック検索:

https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-search-semantic-text.html

関連記事

Elasticsearch の異なるバージョン間およびクラスター間でデータを移行する方法

Kofi Bartlett

Kibana に Elasticsearch クエリルール UI を導入

Jhon Guzmán

JavaScript で Elasticsearch を正しく使う方法、パート II

Jeffrey Rengifo

AWS MarketplaceでElasticsearchをデプロイする方法

Eduard Martin

Azure AKS Automatic に Elasticsearch をデプロイする方法

Eduard Martin

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう