Azure Cosmos DB のフルテキスト検索を試してみる

この記事は、 KENTEM TechBlog アドベントカレンダー2024 19日目、12月19日の記事です。

こんにちは、第二開発部でバックエンドを担当している N.Y です。

2024/11/18-22 に開催された Microsoft Ignite 2024 で、Azure Cosmos DB (以下 Cosmos DB)のフルテキスト検索・ハイブリッド検索のプレビュー機能が発表されました。
今までは Cosmos DB でキーワード検索などを高速に行うためには Azure AI Search (以下 AI Search)を使用する必要がありましたが、Cosmos DB のみで高速な検索が実現できるようになるようです。

devblogs.microsoft.com

今回は、Microsoft のドキュメントを元に Azure ポータル上からフルテキスト検索を試してみました。
所要時間は 15~20 分です!サクッと確認してみたい方は一緒にやってみましょう。

フルテキスト検索機能の概要

フルテキスト検索とは

文書やデータベース内のすべてのテキストを対象にして検索を行う方法です。
Web 検索エンジンなどに用いられています。

Cosmos DB フルテキスト検索の現状

  • 記事執筆時点(2024/12/09)ではプレビュー版
  • 英語 en-us のデータでの検索のみに対応
  • リージョン Asia Japan East でもフルテキスト検索の使用は可能

フルテキスト検索を体験してみよう

Cosmos DB を作成する

こちらの詳しい手順については割愛します。

以下の公式ドキュメントを参考にしていただければ Cosmo DB を作成することができます。 価格レベル Free で作成すると無償で 1000RU/s まで使用できるため、お試しにオススメです。

learn.microsoft.com

Cosmos DB でフルテキスト検索を有効にする

Cosmos DB アカウントのポータル画面から
[設定] > [機能] > [Full-Text & Hybrid Search for NoSQL API (preview)] をオンに設定し、フルテキスト検索を有効にします。

enable Cosmos DB Full-text Search

Database と Container を作成する

Database と Container を作成します。今回は自作の車種データを投入したいと考えているため、そのような名前で作成しています。
PartitonKey には製造メーカーを表す /manufacturer を入れておきます。

  • 注意点
    Database を作成する際に問われる Share throughput across containers にチェックを入れてしまうと、フルテキスト検索のポリシーとインデックスが設定できないためチェックは入れずに作成してください。
    create Database and Container

Database と Container の作成画面を下にスクロールすると、Container Full Text Search Policy が表示されフルテキスト検索の設定が可能になっていることが分かります。
このポリシーは後からでも指定可能のため、今回は一旦空で Database と Container を作成します。

サンプルデータを投入

Database と Container まで作成できたら、ポータルのUpload item ボタンからあらかじめ用意しておいた json 形式のサンプルデータを取り込みます。

upload sample data

  • テストデータ.json
[
    {
        "id": "1",
        "manufacturer": "Toyota",
        "model": "Prius",
        "features": {
            "engine": "1.8L 4-cylinder Hybrid",
            "transmission": "CVT",
            "fuel_type": "Hybrid",
            "seating_capacity": 5,
            "description": "The Toyota Prius is a hybrid car known for its excellent fuel efficiency, eco-friendly design, and advanced technology."
        }
    },
    {
        "id": "2",
        "manufacturer": "Honda",
        "model": "Accord",
        "features": {
            "engine": "2.0L 4-cylinder",
            "transmission": "Automatic",
            "fuel_type": "Gasoline",
            "seating_capacity": 5,
            "description": "The Honda Accord is a midsize sedan that offers a spacious interior, reliable performance, and advanced safety features."
        }
    },
    {
        "id": "3",
        "manufacturer": "Nissan",
        "model": "Leaf",
        "features": {
            "engine": "Electric",
            "transmission": "Single-speed",
            "fuel_type": "Electric",
            "seating_capacity": 5,
            "description": "The Nissan Leaf is an all-electric car that provides zero emissions, a smooth ride, and advanced technology."
        }
    },...(省略)...
]

今回は 30 件ほど取り込んでみました。
ちなみにこのサンプルデータは Copilot に作成してもらったため情報に誤りがある可能性があります。ご了承ください。

フルテキスト検索のポリシーとインデックスを構成

フルテキスト検索を利用するために、ポリシーとインデックスを作成します。

ポリシー

作成した Container の [Scale & Settings] から [Container Policies] > [Full Text Policy] を開きます。

create Full Text Policy

  • Default language
    フルテキスト規定の言語を設定します。現時点では英語のみ選択可能になっています。

  • Path
    フルテキスト検索用にインデックスを作成する項目をパス形式で指定します。
    今回は車種の詳細features/descriptionを指定します。

    • 注意
      このパスに指定していない項目は、次のインデックス作成ができないようになっています。
      また、パスにワイルドカードを使用して/features/*などとしたかったのですが、現時点ではワイルドカードは使用できないようでエラーとなってしまいました。

インデックス

フルテキスト検索のインデックスを作成することで、効率的な検索が可能になります。作成せずともフルテキスト検索自体は可能ですが、検索対象の項目が判明している場合は入れておいて損は無いと思います。
Azure ポータル上で [Full Text Policy] の横に並んでいる [Indexing Policy] を開きます。

create Indexing Policy

  • indexingMode
    インデックス作成モードです。consistentにすることで、項目の作成、更新、削除時に同期してインデックスが更新され一貫性がサポートされます。

  • automatic
    規定で true になっています。Cosmos DB に項目が書き込まれる時点で自動的にインデックスが作成されます。
    基本的には indexingMode consistent と併用して true となっているイメージです。

  • includedPaths
    普通の検索で使用されるインデックスの項目を設定できます。
    デフォルトですべての項目にインデックスが作成されています。

  • includedPaths
    除外したいインデックスの項目を指定します。

  • fullTextIndexes
    フルテキスト検索で使用する項目を設定し、フルテキスト検索用のインデックスを作成することができます。
    今回はポリシーと同じく車種の詳細features/descriptionを指定します。

インデックスについての詳しい情報は以下の公式ドキュメントが分かりやすいです。

learn.microsoft.com

フルテキスト検索を試す

さっそくフルテキスト検索を試してみましょう。ポータル画面のNew SQL Query アイコンからクエリを試すことができます。

現在用意されている検索クエリは4つです。

FullTextContains

  • 特徴
    特定のキーワードが含まれているドキュメントを検索する場合に使用します。

features/description"powerful" の文字列が含まれているドキュメントを返却します。

SELECT * FROM c WHERE FullTextContains(c.features.description, "powerful") 

FullTextContains

FullTextContainsAll

  • 特徴
    複数のキーワードが含まれているドキュメントを検索する場合に使用します。

features/description"powerful""sports" が含まれているドキュメントを返却します。

SELECT * FROM c WHERE FullTextContainsAll(c.features.description, "powerful", "sports") 

FullTextContainsAll

FullTextContainsAny

  • 特徴
    指定したいずれかのキーワードが含まれているドキュメントを検索する場合に使用します。

features/description"sports""luxury" のいずれかの文字列が含まれているドキュメントを返却します。

SELECT * FROM c WHERE FullTextContainsAny(c.features.description, "sports", "luxury") 

FullTextContainsAny

FullTextScore

  • 特徴
    検索結果を関連性の高い順で表示したい場合に使用します。
    一般的に検索結果は関連性が高いものが上位に表示されて欲しいため、このクエリはよく使用されるようになるのではないかと思います。

features/description"sports" または "luxury" の文字列が含まれるドキュメントを関連性の順序で並べ替えます。

SELECT TOP 10 * FROM c ORDER BY RANK FullTextScore(c.features.description, ["sports", "luxury"])

FullTextScore

まとめ

今回は最新技術に触れるという目的で、 Cosmos DB のフルテキスト検索を触ってみました。
今までは高速なフルテキスト検索の実現には AI Search を使用していましたが、高価なサービスのため使用をためらうこともあったと思います。
また、AI Search でインデックスを作成すると、そのインデックスを常に最新に更新するために Cosmos DB Change Feed をトリガーとして発火するインデクサーを作成する必要がありました。
そのあたりも Cosmos DB 内で完結するということで、今後は Cosmos DB での検索が主流になってくるのではと感じます。
Cosmos DB についてはベクトル検索・ハイブリッド検索もマストの技術となっているため、様々な検索手法を自分で触ってインプットしていきたいです。

終わりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。

recruit.kentem.jp

career.kentem.jp