Dynamic Search(Search APIとも呼ばれる)により、select_oneselect_multiple、またはtextフィールドが調査員の入力に合わせて実行時にリモートWebサービスから選択肢を読み込めます。選択肢リストがCSVファイルにバンドルするには大きすぎる場合、頻繁に更新される場合、またはライブデータベースから取得する場合に適したアプローチです。


search-api()外観

ダイナミック検索はappearance列でsearch-api()関数を使用して設定されます:

  search-api(method, url, post_body, value_column, display, data_path, save_path)
  

パラメーター

パラメーター説明
method常に'POST'を使用
urlクエリするAPIエンドポイント
post_bodyAPIに送信されるJSONボディ。調査員の現在の検索テキストのプレースホルダーとして%__input__%を使用
value_column保存されるとして使用するレスポンスオブジェクトのキー
displayドロップダウンに表示されるラベルとして使用するキー(またはテンプレート)。##key##プレースホルダーと@{func}式をサポート
data_pathレスポンス内の結果オブジェクトの配列へのJSONPath(例:$.data$.hits.hits.*._source
save_path他のフィールドが使用するために生のレスポンスが保存される名前

基本的な例

調査員が施設名の一部を入力する医療施設検索:

typenamelabelappearance
select_onefacility医療施設を選択してくださいsearch-api('POST', 'https://api.example.com/facilities/search', '{"query": "%__input__%"}', 'id', 'name', '$.results', 'facility_data')

調査員が「nair」と入力するとAPIは{"query": "nair"}を受け取り、以下を返します:

  {
  "results": [
    {"id": "HF001", "name": "Nairobi Central Clinic"},
    {"id": "HF002", "name": "Nairobi West Hospital"}
  ]
}
  

ドロップダウンにはNairobi Central ClinicNairobi West Hospitalが表示され、保存される値はHF001またはHF002です。


高度な表示フォーマット

##key##テンプレートの使用

ラベルに複数のフィールドを表示する:

  search-api('POST', 'https://api.example.com/search', '{"q": "%__input__%"}', 'id', '##name## (##district##)', '$.data', 'res')
  

Nairobi Central Clinic (Nairobi)のように表示されます。

@{func}式の使用

表示ラベルに条件ロジックを適用する:

  search-api('POST', 'https://api.example.com/search', '{"q": "%__input__%"}', 'id',
  '@{if_else(eq("##status##", "active"), "✓ ##name##", "✗ ##name##")}',
  '$.data', 'res')
  

アクティブな結果は✓ クリニック名と表示され、非アクティブは✗ クリニック名と表示されます。


デフォルト値の設定:search-default-api()

search-api()の後にsearch-default-api()を使用して、別のAPIコールから読み込まれたデフォルトの選択肢でフィールドを事前入力します(例:既存のレコードを編集するとき):

  appearance: search-api(...) search-default-api('POST', 'https://api.example.com/get', '{"id": "##saved_id##"}', 'id', 'name', '$.item')
  

select_multipleのカスタムセパレーター:search-default-separator()

select_multipleフィールドでは、複数の選択された値が保存文字列でどのように結合されるかを指定します:

  appearance: search-api(...) search-default-separator(' || ')
  

デフォルトのセパレーターはスペースです。


サポートされる質問タイプ

質問タイプユースケース
select_one検索結果からの単一選択
select_multiple検索結果からの複数選択
textオートコンプリート — 調査員が自由に入力するが提案から選択できる

保存されたレスポンスデータの使用

save_pathは完全なAPIレスポンスオブジェクトを指定された名前で保存します。他のフィールドはpulldata()でそれを参照できます:

typenamelabelcalculation
select_onefacility施設を選択してくださいsearch-api(..., 'facility_data')
calculatefacility_districtpulldata('facility_data', 'district')
calculatefacility_typepulldata('facility_data', 'type')

ベストプラクティス

  1. APIエンドポイントが1〜2秒以内に応答することを確認してください — 遅いAPIは検索を応答性がなく感じさせます。
  2. APIが一致する結果のみを返すようにpost_bodyで%__input__%を使用してください。
  3. 高速なレスポンスのためにサーバー側で検索フィールドをインデックス化してください(例:Elasticsearch、データベースの全文インデックス)。
  4. クエリごとの結果を20〜50項目に制限してください — 何千もの結果を返すと検索の目的が失われます。
  5. 単一文字の入力に対して広いクエリがトリガーされないように、APIに最小入力長の要件を含めてください。

制限事項

  • Dynamic Searchはネットワーク接続が必要です — オフラインでは機能しません。
  • %__input__%プレースホルダーはそのまま注入されます;インジェクション攻撃を防ぐためにサーバー側で入力をサニタイズしてください。
  • 複雑な@{func}表示式はすべてのrtSurveyクライアントバージョンでサポートが制限されている場合があります。
このページは役に立ちましたか?