Azure Search で複合データを利用して高度な検索アプリケーションを作成

2019年6月27日 に投稿済み

Principal Program Manager, Azure Search

データが単純であることはめったにありません。データによっては、単一の Excel ワークシートの行と列にうまく収まらない場合もあります。データの関係は多種多様で、たとえば 1 人の顧客に対して複数の所在地と電話番号が存在したり、1 冊の書籍に対して複数の著者とジャンルが登録されていたりといったケースがあります。もちろん、通常はこのケースよりもさらに関係は複雑です。データを理解するために AI を活用し始めても、新しいインサイトを入手することで関係が複雑になるばかりです。そのため、データを検索できるようにデータ構造のフラット化をお客様に行っていただくのは、多くの場合、現実的ではありません。この件に関してお客様から同じ悩みを抱えているという声が続出し、ほどなくして Azure Search における最もご要望の多い機能 (英語) になりました。これにお応えして、今回 Azure Search での複合型のサポートの一般提供開始を発表いたします。今回の記事では、Azure Search で複合型を利用することのメリットと、この機能を使用して作成できるソリューションについてご説明します。 

Azure Search は、開発者が独自のクラウド検索ソリューションを作成できる PaaS (サービスとしてのプラットフォーム) です。

複合データとは

複合データとは、下部構造が階層化またはネスト化されていて、表形式の行セットにきれいに分割できないデータを指します。たとえば、1 冊の書籍に複数の著者がいて、それぞれの著者に複数の属性があるという場合は、単一行のデータとして表すことはできません。ただし、著者をオブジェクトのコレクションとしてモデル化する方法があれば話は別です。複合型はこの機能を提供するもので、文字列や整数などの単純なフィールド構造でデータをモデル化できない場合に使用できます。

複合型の活用方法

Microsoft Build 2019 では、複合型を利用して効果的な検索アプリケーションを作成する方法 (英語) のデモを行いました。このセッションでは、Stack Exchange が提供する多数のオンライン コミュニティの 1 つである Travel Stack Exchange サイトを取り上げました。

Stack Exchange のデータは、JSON 構造でモデル化されているため、Azure Search に簡単に取り込むことができました。このサイトの最初の投稿を例にして、最初のいくつかのフィールドに注目すると、すべてのフィールドは単純なデータ型を使用してモデル化できることがわかります。タグもコレクション (英語) (文字列配列) としてモデル化することができます。

{
   "id": "1",
    "CreationDate": "2011-06-21T20:19:34.73",
    "Score": 8,
    "ViewCount": 462,
    "BodyHTML": "<p>My fiancée and I are looking for a good Caribbean cruise in October and were wondering which
    "Body": "my fiancée and i are looking for a good caribbean cruise in october and were wondering which islands
    "OwnerUserId": 9,
    "LastEditorUserId": 101,
    "LastEditDate": "2011-12-28T21:36:43.91",
    "LastActivityDate": "2012-05-24T14:52:14.76",
    "Title": "What are some Caribbean cruises for October?",
    "Tags": [
        "caribbean",
        "cruising",
        "vacations"
    ],
    "AnswerCount": 4,
    "CommentCount": 4,
    "CloseDate": "0001-01-01T00:00:00",​

しかし、このデータセットをさらに詳しく見ていくと、データはすぐに複雑になり、フラット構造にマッピングできないことがわかります。たとえば、単一のドキュメントに多数のコメントや回答が関連付けられている場合があります。  ここでは、投票も複合型として定義されています (技術的にはフラット化できたはずですが、そのためには追加のデータ変換作業が必要になります)。

"CloseDate": "0001-01-01T00:00:00",
    "Comments": [
        {
            "Score": 0,
            "Text": "To help with the cruise line question: Where are you located? My wife and I live in New Orlea
            "CreationDate": "2011-06-21T20:25:14.257",
           "UserId": 12
        },
        {
            "Score": 0,
            "Text": "Toronto, Ontario. We can fly out of anywhere though.",
            "CreationDate": "2011-06-21T20:27:35.3",
            "UserId": 9
        },
        {
            "Score": 3,
            "Text": "\"Best\" for what?  Please read [this page](http://travel.stackexchange.com/questions/how-to
            "UserId": 20
        },
        {
            "Score": 2,
            "Text": "What do you want out of a cruise? To relax on a boat? To visit islands? Culture? Adventure?
            "CreationDate": "2011-06-24T05:07:16.643",
            "UserId": 65
        }
    ],
    "Votes": {
        "UpVotes": 10,
        "DownVotes": 2
    },
    "Answers": [
        {
            "IsAcceptedAnswer": "True",
            "Body": "This is less than an answer, but more than a comment…\n\nA large percentage of your travel b
            "Score": 7,
            "CreationDate": "2011-06-24T05:12:01.133",
            "OwnerUserId": 74

これらのデータはすべて、検索エクスペリエンスにおいて重要です。たとえば、以下のような処理を行うことができます。

さらには、Stack Exchange の既存の検索インターフェイスを強化することもできます。そのためには、コグニティブ検索 (英語) を利用して回答からキーフレーズを抽出し、ユーザーが検索ボックスに入力すると同時にオートコンプリート (英語) にフレーズの候補を表示します。

上記のすべての処理が可能になったのは、このデータを複合構造にマッピングできるだけでなく、優れた検索エクスペリエンスを作成できるように、この拡張構造が検索クエリによってサポートされているためです。

次のステップ

Azure Search の複合型の詳細については、こちらのドキュメントをご覧ください。また、こちらの動画 (英語) では、この Travel Stack Exchange のデータをさらに掘り下げています。私が作成した関連コード (英語) と併せてご確認ください。