サーチボードの使い方(文書検索タイプ)

Search Board How-To Guide

はじめに

本ドキュメントでは、サーチボードの作成から検索を試すところまでを解説しています。サンプルデータを使って試していくことで、以下のことが学べるようになっています。

  • サーチボードの作り方が学べます。
  • 付属の簡易検索アプリの使い方が学べます。

最後に、[Web API の紹介]と題しサーチボードを利用する API について簡単に解説しています。サーチボードを使ったアプリを開発する際の参考としてお使いください。

サーチボード(文書検索タイプ)とは何か

サーチボード(文書検索タイプ)では、お客さま専用の文書検索エンジンをお客さまの Google Cloud Platform(GCP)上に構築し提供します。

サーチボード概要図

この文書検索エンジンは、知りたい事柄や質問を日常使っている自然な形の文章で入力すると、登録済みの文書の中からその質問の回答として可能性の高い文章を返します。

この文書検索エンジンを使うことで、プライベートはもちろんのことパブリックな検索サービスを簡単かつスピーディに立ち上げることが可能となります。

特徴

サーチボード(文書検索タイプ)には、以下の特徴があります。

  • 簡単に文書検索エンジンが構築できる

    BLOCKS でサーチボード(文書検索タイプ)を作成すると、文書検索エンジンの環境を自動で構築します。専門的な知識は不要です。構築先となる GCP プロジェクト・文書検索エンジン用仮想マシンの台数・仮想マシンのタイプ・ディスクサイズなどを指定するだけで、用途に合わせた構成での環境構築が可能です。

  • Q&A 形式の文書検索に強い

    問い合わせをまとめた Q&A 形式の文書検索において、高い検索精度が得られやすいです。

  • JSON 形式の RESTful API

    文書検索エンジンには、JSON 形式の RESTful API(API)を使ってアクセスできます。この API を使って、文書検索エンジンを活用した検索アプリや検索ボットなどのアプリケーションの開発が可能です。

  • 簡単データ登録

    検索対象となる文書は、CSV 形式のテキストファイルとして用意しておくことで、サーチボード(文書検索タイプ)を使って簡単に登録ができます。

  • カスタマイズ

    3 種類の辞書(ユーザー辞書・同義語辞書・除外ワード辞書)による検索のカスタマイズができます。

  • 簡易検索アプリが付属

    簡易検索アプリが付属しています。この簡易検索アプリを使って、簡単に検索エンジンの性能が確認できます。

試してみよう

実際にサーチボードを作り、付属の簡易検索アプリを使って、文書を検索してみます。

おおまかな流れは以下のとおりです。

おおまかな流れ図
  1. データの準備

    サンプルの文書と辞書のデータを用意しています。まず、このデータをダウンロードします。

  2. ボードの作成

    サーチボードを作成します。マウスのボタンを数回クリックするだけの簡単操作でサーチボードが作成できます。

  3. データのアップロード

    サーチボードへ登録するデータは、あらかじめ GCS 上の所定の場所にアップロードしておく必要があります。ここで、1.のステップで準備したデータ(文書と辞書)を GCS へアップロードします。

  4. インデックスの作成

    サーチボードは、1 つのボードで複数の検索サービスの提供が可能です。インデックスは、1 つの検索サービスに対応します。データ(文書と辞書)は、このインデックスに登録します。ここでは、インデックスを 1 つ作成し、同時に辞書データを登録します。

    1 つでもインデックスがないと検索サービスは使えません。

  5. データの登録

    4.で作成したインデックスに文書データを登録します。データの登録が完了すると、サーチボードを使った検索サービスが利用可能となります。

  6. 簡易検索

    付属の簡易検索アプリを使って、サーチボードが提供する検索サービスを簡単に試せます。

1.データの準備

サンプルの文書と辞書のデータを用意しています。まず、このデータをダウンロードします。

今回用意したサンプルデータは、厚生労働省が公開しているインフルエンザQ&A をサーチボード用に加工したものです。

このサンプルデータは以下の URL で公開しています。ZIP 圧縮していますので、ダウンロード後、 解凍してください。

https://storage.googleapis.com/blocks-docs/search-board-howto/text-search-sample.zip

ファイルを解凍すると、以下の構成でファイルとフォルダーが展開されているはずです。

サンプル文書フォルダの構成図

以下、各データについて簡単に確認しておきます。

辞書フォルダー

辞書は、必ず analysis というフォルダーの中に配置しなければなりません。各辞書のファイル名は自由です。

  • ユーザー定義辞書

    ユーザー辞書は、標準の辞書では正しく認識されない単語を登録するための辞書でえす。 ユーザー定義辞書について詳しくは、ヘルプを参照してください。

    user.txt の内容:
    感染症例,感染 症例,カンセン ショウレイ,カスタム品詞
    鳥インフルエンザ,鳥 インフルエンザ,トリ インフルエンザ,カスタム品詞
    

  • 同義語辞書

    同義語辞書は、あいまい検索のための辞書です。同義語辞書について詳しくは、ヘルプを参照してください。

    synonyms.txt の内容:
    インフル => インフルエンザ
    こども,子供,幼児,赤ちゃん,小学生 => 小児・未成年者
    

  • 除外ワード辞書

    除外ワード辞書は、検索の対象としない語句を登録するための辞書です。除外ワード辞書について詳しくは、ヘルプを参照してください。

  • stopwords.txt の内容:
    中国
    歴史
    

このサンプル辞書データは、辞書の書き方を紹介する目的のものであり、検索結果に影響を与えるものではありません。

検索文書

サーチボード(文書検索タイプ)では、検索対象となる文書を過去の質問と回答のデータに分けておき、これらを関連付けて管理する方式をとっています。なお、データを分けずに、すべての文書を回答データにまとめての登録もできます。

質問と回答の対応づけ通常のケース
質問と回答の対応づけデータを分けないケース
通常のケース データを分けないケース

質問データと回答データの関連付けは、関連付け方によって以下のタイプに分けられます。

関連付けのタイプ
(回答:質問)
イメージ図 説明
1 対 0
関連付けタイプが1 対 0
回答データのみのため、関連はない。
1 対 1
関連付けタイプが1 対 1
双方のデータが 1 対 1 に対応している。
1 対多
関連付けタイプが1 対多
回答データは複数の質問に関連する可能性があるが、質問データは 1 件の回答にのみ関連する。
多対 1
関連付けタイプが多 対 1
回答データは 1 件の質問にのみ関連するが、質問データは複数の回答に関連する可能性がある。
多対多
関連付けタイプが多 対多
回答データは複数の質問に関連する可能性があり、質問データも複数の回答に関連する可能性がある。

サンプルでは、1 対 1 のデータを用意しています。以下に、各データの抜粋内容を掲載します。

回答データの内容(influenza-answer.csv):
id,body
1," 一般的に、風邪は様々なウイルスによって起こりますが、普通の風邪の多くは、のどの痛み、鼻汁、くしゃみや咳等の症状が中心で、全身症状はあまり見られません。発熱もインフルエンザほど高くなく、重症化することはあまりありません。
 一方、インフルエンザは、インフルエンザウイルスに感染することによって起こる病気です。38℃以上の発熱、頭痛、関節痛、筋肉痛、全身倦怠感等の症状が比較的急速に現れるのが特徴です。併せて普通の風邪と同じように、のどの痛み、鼻汁、咳等の症状も見られます。お子様ではまれに急性脳症を、御高齢の方や免疫力の低下している方では肺炎を伴う等、重症になることがあります。"
2," 季節性インフルエンザは流行性があり、いったん流行が始まると、短期間に多くの人へ感染が拡がります。日本では、例年12月~3月が流行シーズンです。"

質問データの内容(influenza-question.csv):
id,body,target_id
1,インフルエンザと普通の風邪はどう違うのですか?,1
2,インフルエンザはいつ流行するのですか?,2

各データのフォーマットについて詳しくは、以下のヘルプを参照してください。

これでデータの準備が整いました。続いて、サーチボードを作成します。

2.サーチボードの作成

BLOCKS ログイン直後の画面(ダッシュボード画面)から始めます。まだ BLOCKS にログインしていない場合は、ログインを済ませてください。

ボード一覧の表示

BLOCKS 基本画面のサイドバーからボード一覧アイコンをクリックして、ボード一覧画面に切り替えます。ボードの作成や編集などのボードに対する操作は、このボード一覧画面で行います。

ボード作成

ボード一覧画面の上部にある[新規ボード作成]ボタンをクリックして、ボードの作成を開始します。

ボード選択

サーチボード(文書検索タイプ)を作成するため、[サーチボード]をクリックして、[次へ]ボタンをクリックします。

ボードタイプ選択

文書検索タイプ]をクリックして、[次へ]ボタンをクリックします。

ボード名を設定する画面が表示されます。

ボード名設定

ボード名を入力し、[次へ]ボタンをクリックします。

GCP サービスアカウント設定の画面が表示されます。ただし、この画面が表示されるのは、トライアルユーザーおよびセルフサービスプランの方のみです。フルサービスプランの場合は、この画面は表示されませんので、この画面の操作部分は読み飛ばしてください。

GCP サービスアカウントの選択

この画面では、GCP サービスアカウントの選択と、GCP の各種 API の有効化を行います。

まず、GCP サービスアカウントを選択します。

   

<セルフサービスプラン(無料トライアル)の場合>

  • GCP サービスアカウントの役割にオーナー権限が付与されている必要があります。

    GCP サービスアカウントの役割にオーナー権限がない場合は、GCP コンソールの IAM のページにアクセスして、該当する GCP サービスアカウントの役割にオーナー権限を付与してください(図の 1 → 2 → 3 の順)。

    GCP コンソールの IAM 画面

API の有効化]項目が表示されます。

GCP サービスアカウント設定

確認ボタンの前に、チェックマークが付かない API がある場合は、以下の手順で API を有効にします。

  1. API 名横のアイコンをクリックします。

    APIへのリンクアイコンのハイライト

  2. GCP の API 画面が表示されます。画面内の[有効にする]ボタンをクリックします。

    API の有効化

  3. API が有効化されたら(画面上部に[無効にする]が表示されたら)、GCP の画面を閉じて、BLOCKS の画面に戻ります。

    API の有効化を確認

この手順を有効化されていない API すべてについて行います。

API の有効化を行った API について、それぞれの[確認]ボタンをクリックして、[確認]ボタンの前にチェックマークが付くことを確認します。

もし、チェックマークが付かない場合は、しばらく時間をおいてから[確認]ボタンをクリックしてみてください。状況によっては、すぐにはチェックマークが付かない場合もあります。

それでもチェックマークが付かない場合は、以下の原因が考えられます。

  • GCP サービスアカウントの役割に[オーナー]権限が付与されていない。
  • 対象の GCP プロジェクトの課金が有効になっていない。

API の有効化がすべて完了したら、[次へ]ボタンをクリックします。

ボードのオプションを設定する画面が表示されます。

オプション画面の表示

この画面では、GCP 上に構築する文書検索エンジン用のマシンスペックや簡易検索アプリの利用有無などを設定します。

ここでは、簡易検索アプリの設定のみを変更し、その他はデフォルトのままで進めます。

簡易検索アプリの有効化

[簡易検索アプリ設定]項目の[GAE を利用する]と[簡易検索アプリを起動する]のチェックボックスにチェックを入れて、パスワードを設定後、[次へ]ボタンをクリックします。

パスワード入力欄横の目のアイコン()をクリックすると、入力したパスワードの内容が確認できます。

入力内容の確認画面が表示されます。

オプションの確認

完了]ボタンをクリックします。

サーチボード(文書検索タイプ)作成の確認画面が表示されます。

作成確認画面

ここで、[OK]ボタンをクリックすると、サーチボードが作成されます。作成には、しばらく時間がかかります。作成が完了するまで、BLOCKS の操作はできません。作成が完了するまで、そのままお待ちください。

作成が完了すると、サーチボードの詳細画面が表示されます。

作成完了後の画面

これで、サーチボードの作成は完了です。

3.データを GCS へアップロード

サーチボードへ登録するデータは、あらかじめ GCS 上の所定の場所にアップロードしておく必要があります。ここで、1.のステップで準備したデータ(文書と辞書)を GCS へアップロードします。

GCS のアップロード先は、ボード詳細画面の「このボードで使用しているリソース」>「Cloud Storage」>「バケット」に記載されているバケットです。

GCS上のバケット確認

なお、表示されるバケットは作成するボードごとに異なります(上図と同じバケットにはなりません)。

データのアップロードは、BLOCKS の GCS Explorer を使うと簡単です。ここでは、GCS Explorer を使ったデータのアップロード方法を紹介します。

GCS Explorer を開く

サイドバーの GCS Explorer のアイコンにマウスカーソルを合わせと、メニューが表示されます。そのメニューから[新しいタブで開く]をクリックします。

新しいタブに、GCS Explorer が表示されます。

GCS Explorer画面

まず、GCP サービスアカウントを選択します(❶)。続いて、先ほど確認したバケットを選択します(❷)。

GCS上のバケット確認

データは、このバケットにアップロードします。

辞書は、フォルダーごとアップロードするため、[フォルダをアップロードする]ボタンをクリックします。

フォルダー選択の画面が表示されます(下図は macOS の例です)。

フォルダの選択

サンプルデータの analysis フォルダーをクリックし、[アップロード]ボタンをクリックします。

しばらくすると analysis フォルダーがアップロードされます。

ファイルのアップロード

続いて、質問データと回答データをアップロードします。[ファイルをアップロードする]ボタンをクリックします。

ファイル選択の画面が表示されます(下図は macOS の例です)。

フォルダの選択

influenza-answer.csv]と[influenza-question.csv]を選択して、[開く]ボタンをクリックします。

しばらくすると、ファイルがアップロードされます。

アップロード結果

以上で、データのアップロードは完了です。

4.インデックスの作成

サーチボードは、1 つのボードで複数の検索サービスの提供が可能です。インデックスは、1 つの検索サービスに対応します。データ(文書と辞書)は、このインデックスに登録します。ここでは、インデックスを 1 つ作成し、同時に辞書データを登録します。

index画面

インデックス一覧]の[インデックス作成]ボタンをクリックします。

インデックス作成画面が表示されます。

index作成

この画面で、インデックス名と先ほどアップロードした GCS 上の辞書を指定します。

インデックス名には、小文字の半角英数とハイフン(-)が指定できます。ただし、先頭は英数のみです。例えば、「influenza-faq」のように指定します。

辞書は、フォルダーのアイコンをクリックすると表示される GCS ファイルセレクターを使って、GCS 上のファイルを指定します。

辞書ファイル選択

辞書の指定は、バケットと analysis フォルダーを展開し、該当するファイルをクリックし、[選択]ボタンをクリックします。

辞書とファイルの対応は、以下のとおりです。

ユーザー辞書 user.txt
類義語辞書 synonyms.txt
除外ワード辞書 stopwords.txt

インデックス名の入力と辞書の指定が終わると、以下のような表示になります。

辞書指定後の画面

作成]ボタンをクリックすると、インデックスの作成が始まります。

インデックス一覧の表示が以下のように変わります。

インデックス作成中

インデックスの作成には、しばらく時間がかかります。完了するまで、しばらくお待ちください。

ステータスが[作成中]から[作成済み]に変わったら完了です。

インデックス作成完了

以上で、インデックスの作成は完了です。

5.データの登録

4.で作成したインデックスに文書データを登録します。データの登録が完了すると、サーチボードを使った検索サービスが利用可能となります。

データの登録

データを登録する]をクリックします。

データ登録の画面が表示されます。

データの登録

データの指定は、バケットを展開し、該当するファイルをクリックし、[選択]ボタンをクリックします。

データとファイルの対応は、以下のとおりです。

回答データ influenza-answer.csv
質問データ influenza-question.csv

データの指定が終わると、以下のような表示になります。

データファイル指定後の画面

登録]ボタンをクリックすると、データの登録が始まります。

インデックス一覧の表示が以下のように変わります。

データ投入中

データの登録には、しばらく時間がかかります。完了するまで、しばらくお待ちください。

ステータスが[投入中]から[投入成功]に変わったら完了です。

インデックス一覧の表示が以下のように変わります。

データ登録完了

以上でデータの登録は完了です。

6.簡易検索アプリを使って検索を試す

データの登録が完了すると、付属の簡易検索アプリを使って、サーチボードが提供する検索サービスを簡単に試せます。

簡易検索アプリを開く

開く]をクリックします。

認証画面が表示されます。

簡易検索アプリを開く

以下のユーザー名とパスワードを入力して、[ログイン]ボタンをクリックします。

ユーザー名 demo
パスワード サーチボード作成時に設定したパスワード

簡易検索アプリが表示されます。

簡易検索アプリのTOP画面

簡易検索アプリの使い方は簡単です。ボックス内に質問文章を入力し、[Search]ボタンをクリックするだけです。即座に結果が[Search]ボタンの下に表示されます。

Search]ボタン左の limit は、検索結果の表示件数の最大数です。limit の数値部分をクリックすると、5・10・20・30 件の中から切り替えできます。

簡易検索アプリの limit 選択中の図

以下は、「インフルエンザが流行する時期は?」と入力して検索した例です。

簡易検索アプリの検索結果画面

以上ですべてのステップの完了です。

サーチボードを使いこなすコツ

いかがでしたでしょうか。データさえあれば、簡単に文書検索エンジンのサービスが立ち上げられることが実感できたのではないかと思います。

ただし、サーチボードの作り方を覚えてもそれだけで効果的な文書検索サービスが立ち上げられるわけではありません。

そこで、最後に効果的な文書検索サービスを立ち上げるための、サーチボードを使いこなす 3 つのコツを紹介します。

  • コツ 1ー1 つの文書に複数のテーマが含まれないようにする

    1 つの文書に複数のテーマが含まれていると検索精度が良くない傾向にあります。

    1 つの文章に複数のテーマが含まれている場合は、1 文章 1 テーマとなるように分割してください。 これにより検索精度の向上が見込めます。

  • コツ 2ー 文字数が少ない文章を精査する

    登録されているデータの文字数が少ないものは検索に引っかからないか、上位に表示されにくい傾向にあります。

    文字数が少ないとその文書(質問や回答)の特徴を示す言葉が書かれていないことが多く、思うような検索結果を得ることができません。

    このような場合は、文書の特徴を示す文言が含まれるように加筆・修正することで、検索精度の向上が見込めます。

  • コツ 3ー 検索結果の評価を反映する

    お客さま開発アプリの検索結果の詳細を表示する画面に、「この結果はお役に立ちましたか」のような質問を表示し、その回答で良い評価が得られた場合は、質問と回答の関連付けを更新します。

    このようにしておくと、次に同じような質問が来たときに、今回の回答が上位に表示されやすくなります。

Web API の紹介

サーチボード(文書検索タイプ)の文書検索エンジンには、JSON 形式の RESTful API(API)を使ってアクセスできます。この API を使って、検索エンジンを活用した検索アプリや検索ボットなどのアプリケーションの開発が可能です。

ここでは、現在公開している 14 種類の API について簡単に解説しています。サーチボードを使ったアプリを開発する際の参考としてお使いください。

API の解説中に表れる<>で囲まれた記述は、以下の説明にしたがって読み替えてください。

<IP アドレス:ポート番号> サーチボード詳細画面の「接続情報」で示される IP アドレスとポート番号です。
<インデックス名> API 発行対象のインデックス名です。
<回答 ID> 回答文書の ID です。
<質問 ID> 質問文章の ID です。

API の解説中の「curl コマンド例」の実行例は、文書検索エンジンを構築した同一ネットワーク上の仮想マシンから実行した例です。

1.質問から回答を検索(回答データのみのケース)

概要

質問文章からその回答として近い回答データを返します。返ってくる回答データの順番は、質問文章に回答として近しい順です。

対象:回答データと質問データの関係が 1:0(回答データのみ)のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/target,hint/_search
メソッド GET
リクエスト例
api_search_1_0
レスポンス例
{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 32,
    "max_score": 4.0507264,
    "hits": [
      {
        "_index": "influenza-faq",
        "_type": "target",
        "_id": "7",
        "_score": 4.0507264,
        "_source": {
          "body": " インフルエンザは、地域によって時期は異なりますが、世界中で流行が見られます。一般的には、温帯地方では冬季(南半球では6~9月)に流行が見られます。熱帯・亜熱帯地方では国や地域により様々で、年間を通じて低レベルの発生が見られる地域や、複数回流行する地域もあります。流行するウイルスの種類は地域によって差はありますが、大きく違いません。世界における流行状況は、WHOのホームページ等で知ることができます。\n\n世界保健機関(WHO):Influenza updates(インフルエンザ最新情報)→http://www.who.int/influenza/surveillance_monitoring/updates/en/",
          "target_id": "7"
        }
      },
      {
        "_index": "influenza-faq",
        "_type": "target",
        "_id": "5",
        "_score": 3.4223063,
        "_source": {
          "body": " 平成21(2009)年4月に新型インフルエンザA(H1N1)2009ウイルスがメキシコで確認され、世界的大流行となり、我が国でも多くの人々が免疫を持っていなかったため、同年秋季を中心に大規模な流行となりました。発生後、一年余で約2千万人が罹患したと推計されましたが、入院患者数は約1.8万人、死亡者は203人であり、死亡率は0.16(人口10万対)と、諸外国と比較して低い水準にとどまりました。翌年には、新型インフルエンザA(H1N1)2009ウイルスに加え、A香港型やB型のインフルエンザウイルスも流行しており、季節性インフルエンザとは異なる時期に大きな流行が発生する等の特別な状況は確認されませんでした。\n\n このような状況を踏まえ、厚生労働省は、平成23(2011)年3月31日の時点において「新型インフルエンザ」と呼ばれていたインフルエンザA(H1N1)2009ウイルスについて、季節性インフルエンザとして取り扱うこととし、対応も季節性インフルエンザの対策に移行しました。",
          "target_id": "5"
        }
      },
      {
        "_index": "influenza-faq",
        "_type": "target",
        "_id": "13",
        "_score": 3.0334578,
        "_source": {
          "body": " 毎年、日本では、国立感染症研究所と全国の地方衛生研究所が中心となってタミフルやリレンザなどの抗インフルエンザウイルス薬に耐性をもつウイルスの調査を行っています。詳しくは国立感染症研究所のホームページを御覧下さい\n\n国立感染症研究所:抗インフルエンザ薬剤耐性株サーベイランス→http://www.nih.go.jp/niid/ja/influ-resist.html\n\n 抗インフルエンザウイルス薬に耐性化したウイルスが検出される割合は、1~4%程度です。これらのウイルスのほとんどは、抗インフルエンザウイルス薬にて治療を行った後、採取されたウイルスです。\n\n 2013/2014年インフルエンザ流行シーズン当初、札幌で相次いで確認されたタミフルに耐性を持つウイルスは、タミフルでの治療を行っていない患者から検出されました。患者間での接触はなかったと判断されていますが、ウイルスの遺伝子が非常に似ているため、タミフルに耐性を持つウイルスが札幌市内で同時期に流行していた可能性が高いと考えられています。\n\n 一般的に抗インフルエンザウイルス薬に耐性を持ったウイルスは、伝播するスピードが遅いため広く流行することなく、自然に消失します(詳しくは国立感染症研究所にて掲載しています\n\n国立感染症研究所:IASR<速報>2013/14シーズンに札幌市で検出された抗インフルエンザ薬耐性A(H1N1)pdm09ウイルス→http://www.nih.go.jp/niid/ja/flu-m/flu-iasrs/4232-pr4081.html\n\n しかし、2008/2009年インフルエンザ流行シーズンにヨーロッパで出現した、タミフルに耐性化したソ連型A(H1N1)ウイルスが世界的に流行したことから、今後も注意が必要です。",
curl コマンド例
curl -X GET 10.128.0.3:9200/influenza-faq/target,hint/_search -H 'Content-Type:application/json' --data '{ "size": 5, "query": { "match": { "body": "インフルエンザが流行する時期はいつか" } } }'
備考

2.質問から回答 ID を検索(回答と質問が 1:多のケース)

概要

質問文章からその回答として近い回答データの ID("target_id")を返します。返ってくる ID の順番は、質問文章に回答として近しい順です。

対象:回答データと質問データの関係が 1:多のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/target,hint/_search
メソッド GET
リクエスト例
api_search_1_m
レスポンス例
{
  "took": 94,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 61,
    "max_score": null,
    "hits": [
      {
        "_index": "influenza-faq",
        "_type": "target",
        "_id": "7",
        "_score": 5.2207584,
        "_source": {
          "target_id": "7"
        },
        "fields": {
          "target_id": [
            "7"
          ]
        }
      },
      {
        "_index": "influena-faq",
        "_type": "target",
        "_id": "5",
        "_score": 4.3226757,
        "_source": {
          "target_id": "5"
        },
        "fields": {
          "target_id": [
            "5"
          ]
        }
      },
      {
        "_index": "influenza-faq",
        "_type": "target",
        "_id": "13",
        "_score": 3.787116,
        "_source": {
          "target_id": "13"
        },
        "fields": {
          "target_id": [
            "13"
          ]
        }
      }
    ]
  }
}
curl コマンド例
curl -X GET 10.128.0.3:9200/influenza-faq/target,hint/_search -H 'Content-Type:application/json' --data '{ "_source": {"excludes": ["body"] }, "size": 3, "query": { "match": { "body": "インフルエンザが流行する時期はいつか" } }, "collapse": { "field": "target_id" } }'
備考

3.質問から回答 ID を検索(回答と質問が多:多のケース)

概要

質問文章からその回答として近い回答データの ID("target_id")を返します。返ってくる ID の順番は、質問文章に回答として近しい順です。

対象:回答データと質問データの関係が多:多のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/target,hint/_search
メソッド GET
リクエスト例
api_search_m_m
レスポンス例

{
  "took": 11,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 63,
    "max_score": 13.286041,
    "hits": [
      {
        "_index": "influenza-faq",
        "_type": "hint",
        "_id": "10",
        "_score": 13.286041,
        "_source": {
          "body": "インフルエンザにかかったらどうすればよいのですか?",
          "target_ids": [
            "10",
            "14",
            "15"
          ]
        }
      },
      {
        "_index": "influenza-faq",
        "_type": "hint",
        "_id": "9",
        "_score": 10.997316,
        "_source": {
          "body": "インフルエンザにかからないためにはどうすればよいですか?",
          "target_ids": [
            "9"
          ]
        }
      },
      {
        "_index": "influenza-faq",
        "_type": "hint",
        "_id": "17",
        "_score": 8.525941,
        "_source": {
          "body": "インフルエンザにかかったら、どのくらいの期間外出を控えればよいのでしょうか?",
          "target_ids": [
            "17"
          ]
        }
      }
    ]
  }
}
curl コマンド例
curl -X GET 10.128.0.3:9200/influenza-faq/target,hint/_search -H 'Content-Type:application/json' --data '{ "size": 3, "query": { "match": { "body": "インフルエンザにかかったらどうすればよいのですか?" } } }'
備考
  • 「1.質問文章から回答を検索(回答データのみのケース)」と同様です。
  • 回答 ID("target_id")は、同じものが複数返ってくることがあります。アプリケーション側で、ユニークとなるように処理してください。

4.特定の回答を取得

概要 回答 ID を指定して、その回答文書を取得します。
エンドポイント <IP アドレス:ポート番号>/<インデックス名>/target/<回答 ID>
メソッド GET
リクエスト例 (リクエストボディなし)
レスポンス例
{
  "_index": "influenza-faq",
  "_type": "target",
  "_id": "10",
  "_version": 1,
  "found": true,
  "_source": {
    "body": "(1) 具合が悪ければ早めに医療機関を受診しましょう。\n\n(2) 安静にして、休養をとりましょう。特に、睡眠を十分にとることが大切です。\n\n(3) 水分を十分に補給しましょう。お茶でもスープでも飲みたいもので結構です。\n\n(4) 咳やくしゃみ等の症状のある時は、周りの方へうつさないように、不織布製 マスクを着用しましょう。\n\n(5) 人混みや繁華街への外出を控え、無理をして学校や職場等に行かないようにしましょう。\n\n また、小児、未成年者では、インフルエンザの罹患により、急に走り出す、部屋から飛び出そうとする、ウロウロと歩き回る等の異常行動を起こすおそれがあるので、自宅において療養を行う場合、少なくとも発症から2日間、小児・未成年者が一人にならないよう配慮しましょう(Q14、15を参照)。",
    "target_id": "10"
  }
}
curl コマンド例
curl -X GET 10.128.0.3:9200/influenza-faq/target/10
備考

5.回答に関連した質問を取得(回答と質問が 1:多のケース)

概要

回答データに関連付けられた質問データを取得します。

対象:回答データと質問データの関係が 1:多のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/hint/_search
メソッド GET
リクエスト例
api_hint_search_1_m
レスポンス例
{
  "took": 44,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 3.2580965,
    "hits": [
      {
        "_index": "influenza-faq",
        "_type": "hint",
        "_id": "10",
        "_score": 3.2580965,
        "_source": {
          "body": "インフルエンザにかかったらどうすればよいのですか?",
          "target_id": "10"
        }
      }
    ]
  }
}
curl コマンド例
curl -X GET 10.128.0.3:9200/influenza-faq/hint/_search -H 'Content-Type:application/json' --data '{ "query": { "term": { "target_id": "10" } } }'
備考

6.回答に関連した質問を取得(回答と質問が多:多のケース)

概要

回答データに関連付けられた質問データを取得します。

対象:回答データと質問データの関係が多:多のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/hint/_search
メソッド GET
リクエスト例
api_hint_search_1_m
レスポンス例
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.4505018,
    "hits": [
      {
        "_index": "influenza-faq",
        "_type": "hint",
        "_id": "10",
        "_score": 1.4505018,
        "_source": {
          "body": "インフルエンザにかかったらどうすればよいのですか?",
          "target_ids": [
            "10",
            "14",
            "15"
          ]
        }
      }
    ]
  }
}
curl コマンド例
curl -X GET 10.128.0.3:9200/influenza-faq/hint/_search -H 'Content-Type:application/json' --data '{ "query": { "term": { "target_ids": "10" } } }'
備考

7.回答の追加・更新

概要 回答データを追加・更新します。
エンドポイント <IP アドレス:ポート番号>/<インデックス名>/target/<回答 ID>
メソッド POST
リクエスト例
api_target_add
レスポンス例
  • 追加時
    {
      "_index": "influenza-faq",
      "_type": "target",
      "_id": "33",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "created": true
    }
    
  • 更新時
    {
      "_index": "influenza-faq",
      "_type": "target",
      "_id": "33",
      "_version": 3,
      "result": "updated",
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "created": false
    }
    
curl コマンド例
curl -X POST 10.128.0.3:9200/influenza-faq/target/33 -H 'Content-Type:application/json' --data '{ "body": "回答データを追加するサンプル文章です。", "target_id": 33 }'
備考

8.質問の追加・更新(回答と質問が1:多のケース)

概要

質問データを追加・更新します。

対象:回答データと質問データの関係が 1:多のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/hint/<回答 ID>
メソッド POST
リクエスト例
api_target_add
レスポンス例
  • 追加時
    {
      "_index": "influenza-faq",
      "_type": "hint",
      "_id": "33",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "created": true
    }
    
  • 更新時
    {
      "_index": "influenza-faq",
      "_type": "hint",
      "_id": "33",
      "_version": 2,
      "result": "updated",
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "created": false
    }
    
curl コマンド例
curl -X POST 10.128.0.3:9200/influenza-faq/hint/33 -H 'Content-Type:application/json' --data '{ "body": "質問データを追加するサンプル文章です。", "target_id": 33 }'
備考

9.質問の追加・更新(回答と質問が多:多のケース)

概要

質問データを追加・更新します。

対象:回答データと質問データの関係が多:多のケース

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/hint/<回答 ID>
メソッド POST
リクエスト例
api_hint_add_m_m
レスポンス例
  • 追加時
    {
      "_index": "influenza-faq",
      "_type": "hint",
      "_id": "33",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "created": true
    }
    
  • 更新時
    {
      "_index": "influenza-faq",
      "_type": "hint",
      "_id": "33",
      "_version": 1,
      "result": "updated",
      "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
      },
      "created": false
    }
    
curl コマンド例
curl -X POST 10.128.0.3:9200/influenza-faq/hint/33 -H 'Content-Type:application/json' --data '{ "body": "質問データを追加するサンプル文章です。", "target_ids": [1, 16, 32] }'
備考

10.質問に関連付ける回答を追加

概要

質問データに関連付ける回答 ID を追加します。

エンドポイント <IP アドレス:ポート番号>/<インデックス名>/hint/<質問 ID>/_update
メソッド POST
リクエスト例
api_hint_id_add
レスポンス例
{
  "_index": "influenza-faq",
  "_type": "hint",
  "_id": "5",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  }
}
curl コマンド例
curl -X POST 10.128.0.3:9200/influenza-faq/hint/5/_update -H 'Content-Type:application/json' --data '{ "script": "ctx._source.target_ids.add(\"20\")" }'
備考

11.質問文章・回答文章の更新

概要

質問文章もしくは回答文章を更新します。

エンドポイント
  • 質問文章の更新:

    <IP アドレス:ポート番号>/<インデックス名>/hint/<質問 ID>/_update

  • 回答文章の更新:

    <IP アドレス:ポート番号>/<インデックス名>/target/<回答 ID>/_update

メソッド POST
リクエスト例
api_hint_update
レスポンス例
{
  "_index": "influenza-faq",
  "_type": "hint",
  "_id": "5",
  "_version": 3,
  "result": "updated",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  }
}
curl コマンド例
curl -X POST 10.128.0.3:9200/influenza-faq/hint/5/_update -H 'Content-Type:application/json' --data '{ "doc": { "body": "これは質問文章を更新するサンプル文章です。" } }'
備考

12.特定の質問データ・回答データの削除

概要

質問 ID もしくは回答 ID を指定して、特定の質問データもしくは回答データを削除します。

メソッド DELETE
エンドポイント
  • 特定の質問データの削除:

    <IP アドレス:ポート番号>/<インデックス名>/hint/<質問 ID>

  • 特定の回答データの削除:

    <IP アドレス:ポート番号>/<インデックス名>/target/<回答 ID>

メソッド DELETE
リクエスト例 (リクエストボディなし)
レスポンス例
{
  "found": true,
  "_index": "influenza-faq",
  "_type": "hint",
  "_id": "33",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  }
}
curl コマンド例
curl -X DELETE 10.128.0.3:9200/influenza-faq/hint/33
備考

13.質問データ・回答データの全件削除

概要

質問データもしくは回答データを全件削除します。

エンドポイント
  • 質問データの全件削除:

    <IP アドレス:ポート番号>/<インデックス名>/hint/_delete_by_query

  • 回答データの全件削除:

    <IP アドレス:ポート番号>/<インデックス名>/target/_delete_by_query

  • メソッド POST
    リクエスト例
    {
      "query": {
        "match_all": {}
      }
    }
    
    レスポンス例
    {
      "took": 72,
      "timed_out": false,
      "total": 32,
      "deleted": 32,
      "batches": 1,
      "version_conflicts": 0,
      "noops": 0,
      "retries": {
        "bulk": 0,
        "search": 0
      },
      "throttled_millis": 0,
      "requests_per_second": -1,
      "throttled_until_millis": 0,
      "failures": []
    }
    
    curl コマンド例
    curl -X POST 10.128.0.3:9200/influenza-faq/hint/_delete_by_query -H 'Content-Type:application/json' --data '{ "query": { "match_all": {} } }'
    
    備考

    14.質問データ・回答データの一括登録

    概要

    質問データもしくは回答データを一括登録します。

    エンドポイント
    • 質問データの一括登録:

      <IP アドレス:ポート番号>/<インデックス名>/hint/<質問 ID>

    • 回答データの一括登録:

      <IP アドレス:ポート番号>/<インデックス名>/target/<回答 ID>

    メソッド POST
    リクエスト例
    • 質問データ:
      api_hint_request

      複数の回答に関連付く場合は、"target_id"を"target_ids"に変更します。

    • 回答データ:

      形式は質問データと同じです。
      質問 ID」は「回答 ID」に、「質問文章」は「回答文章」に読み替えてください。"target_id" は不要です

    レスポンス例
    {
      "took": 37,
      "errors": false,
      "items": [
        {
          "index": {
            "_index": "influenza-faq",
            "_type": "hint",
            "_id": "1",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 1,
              "successful": 1,
              "failed": 0
            },
            "created": true,
            "status": 201
          }
        },
        {
          "index": {
            "_index": "influenza-faq",
            "_type": "hint",
            "_id": "2",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 1,
              "successful": 1,
              "failed": 0
            },
            "created": true,
            "status": 201
          }
        }
      ]
    }
    
    curl コマンド例
    curl -X POST 10.128.0.3:9200/influenza-faq/hint/_bulk -H 'Content-Type:application/x-ndjson' --data-binary @sample.json
    
    備考