設置コード

検索機能をサイトに設置する方法を説明します。

設置コードの種類

このページでは、検索結果ページをお客様サイトに設置する「埋め込み型」の設置方法を説明します。検索結果ページをneodigが配信する方式については、neodigでホスティングをご覧ください。

埋め込み型では、検索結果ページと検索フォームの2つのコードを設置します。設置方法については、ダッシュボードの手順をご確認ください。

  • 検索結果ページ: 実際の検索結果を表示するページです。search.htmlなどの名前で単体のHTMLファイルとして設置します。
  • 検索フォーム: 検索フォームは、シンプルな入力フォームとサジェスト機能から構成されています。Webサイトの共通ヘッダーなどに、全ページに組み込む形で設置してください。

Google Analytics連携

お客様サイトにGoogle Analytics(GA4)が設置されていれば、サイト内検索の実行時にneodigが view_search_results イベント(検索キーワード付き)を自動送信します。GA4の「検索キーワード」レポートで検索語句を確認できます。追加の設定は不要です。GA4の拡張計測「サイト内検索」を有効にしている場合、このイベントと二重計上になります。

検索結果の設定オプション

検索結果ページのコード内に、neodig-search-config というクラスを持つ <script> タグがあります。この中のJSON設定を変更することで、検索結果の表示内容をカスタマイズできます。SPAフレームワーク(Vue.js、React等)で利用する場合は、<script> タグの代わりに <div hidden> を使用することもできます。

neodig-search-config の <script> タグには、検索結果ページと同じ data-neodig-appid 属性が必須です。属性が無い設定要素は警告のみで無視され、既定値にフォールバックします。

おすすめコンテンツの設定

"recommend": {
  "maxSize": 3,
  "messages": {
    "header": "おすすめコンテンツ"
  }
}
maxSize
number
表示する最大件数です。既定値は3です。
messages
object
各種メッセージをカスタマイズします。

FAQの設定

"faq": {
  "scoreThreshold": 0.7,
  "messages": {
    "header": "FAQからの検索結果",
    "badge": "FAQ",
    "detailLink": "続きを読む"
  }
}
scoreThreshold
number
FAQ検索結果の初期表示に使うスコアの閾値です。既定値は0.7です。検索結果のscoreThresholdと同じルールで適用されます。
messages
object
各種メッセージをカスタマイズします。
messages.header
string
FAQセクションのヘッダーテキストです。既定値はFAQからの検索結果です。
messages.badge
string
FAQセクションのヘッダーに表示されるバッジのテキストです。既定値はFAQです。
messages.detailLink
string
FAQ詳細ページへの導線リンクのテキストです。既定値は続きを読むです。

FAQセクションは、FAQサイト構築機能で登録されたFAQがサイト内検索結果に表示されます。

AI検索の設定(AI Overview / 0件代替提案)

検索結果の上部にAIが生成した要約と引用元(参考にした情報)を表示する機能です。ダッシュボードの「AI検索設定」で動作モードを切り替えます。

動作モード動作
AI Overview(mode=overview)検索のたびに発動し、検索結果の上部にAI要約を表示します。
0件代替提案(mode=fallback)検索ヒット数が0件のときのみ発動し、サイト内の近いページをAIが提案します。
AI検索はProfessionalプラン以上で利用可能です。

検索結果ページのHTMLには、AI検索の表示先となる <div class="neodig-ai-search-section"> を .neodig-result-contents の中(推奨: 最上部)に配置します。

<div class="neodig-result-contents">
    <div class="neodig-ai-search-section"></div>
    <div class="neodig-faq-section"></div>
    <div class="neodig-recommendations-section"></div>
    <div class="neodig-results-section"></div>
</div>

メッセージ等のカスタマイズはJSON設定で行います。

"aiSearch": {
  "enableMarkdown": true,
  "messages": {
    "badge": "AI",
    "header": "AIによる回答",
    "loading": "AIが回答を生成中…",
    "citationsHeader": "参考にした情報",
    "disclaimer": "※生成AIによる回答は誤りを含むことがあります"
  }
}
enableMarkdown
boolean
回答本文のMarkdownレンダリングを有効にするかどうかです。既定値はtrueです。
messages
object
各種メッセージをカスタマイズします。
messages.badge
string
ヘッダーに表示されるバッジのテキストです。既定値はAIです。
messages.header
string
AI回答セクションのヘッダーテキストです。既定値はAIによる回答です。
messages.loading
string
回答を生成している間に表示されるテキストです。既定値はAIが回答を生成中…です。
messages.citationsHeader
string
引用元一覧の見出しテキストです。既定値は参考にした情報です。
messages.disclaimer
string
AI回答の直下に表示される注意書きです。既定値は※生成AIによる回答は誤りを含むことがありますです。

回答が生成できないとき(プラン未契約、モードoff、検索結果が1件以上あるときのmode=fallback、NGワード検出など)はセクション全体が非表示になります。

検索結果の設定

"result": {
  "size": 10,
  "scoreThreshold": 0.7,
  "enableMarkdown": true,
  "lastModifiedDateFormat": "yyyy/MM/dd",
  "messages": {
    "header": "検索結果",
    "notFound": "検索結果が見つかりませんでした",
    "showNext": "さらに表示",
    "limitReached": "検索結果の表示上限に達しました。検索キーワードを変えて検索して下さい",
    "expandDetails": "続きを表示",
    "collapse": "折りたたむ",
    "scrollTop": "",
    "error": "エラーが発生しました。時間を空けて再度お試しください。",
    "rateLimitError": "リクエストが多すぎます。しばらく待ってから再度お試しください",
    "retry": "再試行"
  }
}
size
number
1ページあたりの表示件数です。既定値は10です。
scoreThreshold
number
検索結果を初期表示するときのスコアの閾値です。既定値は0.7です。検索キーワードが入力されている場合のみ適用されます。閾値以上の結果が1件もない場合はフィルタを適用せず全件を表示し、閾値未満の結果は「さらに表示」から表示されます。
enableMarkdown
boolean
Markdown形式のサマリーを有効にするかどうかです。既定値はtrueです。
lastModifiedDateFormat
string
最終更新日時の表示フォーマットです。既定値はyyyy/MM/ddです。yyyy / MM / dd / HH / mm / ss のトークンを置換します。
messages
object
各種メッセージをカスタマイズします。
messages.expandDetails
string
サマリー展開ボタンのテキストです。既定値は続きを表示です。
messages.collapse
string
サマリー折りたたみボタンのテキストです。既定値は折りたたむです。
messages.scrollTop
string
トップへスクロールボタンのテキストです。スクロール位置が一定以上になると、テキストの有無に関わらずボタン自体は表示されます(空文字列の場合はテキストなしで表示され、サンプルCSSでは矢印アイコンのみの円形ボタンになります)。ボタン自体を非表示にしたい場合は、HTMLから.neodig-scroll-top-area要素を削除するか、CSSで非表示にしてください。
messages.error
string
エラーが発生したときのメッセージです。既定値はエラーが発生しました。時間を空けて再度お試しください。です。
messages.rateLimitError
string
レート制限にかかったときのメッセージです。既定値はリクエストが多すぎます。しばらく待ってから再度お試しくださいです。
messages.retry
string
検索エラー時に表示される再試行ボタンのテキストです。既定値は再試行です。クリックすると同じ条件で検索をやり直します。

更新日時フィルタ

検索結果ページのHTMLには、更新日時フィルタ(<select class="neodig-freshness-dropdown">)が含まれています。選択肢は「24時間以内」「1週間以内」「1ヶ月以内」「1年以内」です。選択すると自動的に再検索が実行され、選択状態はURLパラメータ(後述)に保存されます。フィルタが不要な場合は、.neodig-freshness 要素ごとHTMLから削除してください。

入力・表示の制限

  • 検索キーワードは50文字までです。超過すると「検索キーワードは50文字以内で入力してください」と表示され、検索は実行されません
  • サジェスト(入力補完)は25文字を超えると候補を表示しません
  • 検索結果は最大100件まで表示できます。limitReachedのメッセージは、この上限に達したときに表示されます

検索結果ページのURLパラメータ

検索結果ページは、検索条件をURLパラメータとして保持します。

  • q: 検索キーワード
  • freshness: 更新日時フィルタの選択値(day / week / month / year)
  • c_<カテゴリキー>: カテゴリの選択状態(カンマ区切り)

独自のリンクから検索結果ページへ直接遷移させたい場合は、これらのパラメータを付与してください。

結果ページのデザインカスタマイズ

検索結果の表示内容・表示順序の変更

検索結果ページでは、<template> 要素を使用して、おすすめコンテンツと検索結果の表示レイアウトをカスタマイズできます。SPAフレームワーク(Vue.js、React等)で利用する場合は、<template> タグの代わりに <div hidden> を使用することもできます。

<template> タグ(またはその代替の <div hidden>)には、検索結果ページと同じ data-neodig-appid 属性が必須です。属性が無いテンプレート要素は警告のみで無視され、既定のテンプレートにフォールバックします。

テンプレートの種類

検索結果ページには3種類のテンプレートが用意されています。

テンプレートクラス名説明
おすすめコンテンツテンプレート.neodig-recommendation-templateおすすめコンテンツの表示形式
FAQテンプレート.neodig-faq-templateFAQの表示形式
検索結果テンプレート.neodig-result-template検索結果の表示形式

利用可能な表示要素

各テンプレート内で使用できる要素を以下のクラス名で指定します。これらのクラスを持つ要素に、自動的にデータが挿入されます。

おすすめコンテンツテンプレート
クラス名説明
.neodig-recommendation-titleタイトル
.neodig-recommendation-imageサムネイル画像
.neodig-recommendation-url表示用URL
.neodig-recommendation-summary要約文
FAQテンプレート

FAQはアコーディオン形式で表示されます。デフォルトでは <details> / <summary> を使った折り畳み構造でレンダリングされ、回答エリアには detailUrl がある場合に「続きを読む」リンクが表示されます。

クラス名説明
.neodig-faq-title質問タイトル(<summary> 内に配置されアコーディオン開閉ラベルとして動作)
.neodig-faq-summary回答の抜粋
.neodig-faq-detail-linkFAQ詳細ページへの導線ラベル(detailUrl がある場合のみ表示される)
検索結果テンプレート
クラス名説明
.neodig-result-titleタイトル
.neodig-result-imageサムネイル画像
.neodig-result-url表示用URL
.neodig-result-summary要約文
.neodig-result-last-modified最終更新日時 (デフォルト非表示)
.neodig-result-generic-field1汎用フィールド1 (デフォルト非表示)
.neodig-result-generic-field2汎用フィールド2 (デフォルト非表示)
.neodig-result-generic-field3汎用フィールド3 (デフォルト非表示)
.neodig-result-category-tagsカテゴリタグ一覧 (デフォルト非表示)

カスタマイズの自由度

テンプレートを編集することで、以下のようなカスタマイズが可能です。

  • 不要な要素のクラスを削除して、その情報を非表示にできます
  • タイトル、画像、要約などの表示順序を自由に変更できます
  • 独自のラッパー要素やグリッドレイアウトを追加して、サイトのデザインに合わせた構造を構築できます

注意事項

  • 表示したい情報のクラス名を持つ要素を必ずテンプレート内に含めてください
  • クラス名は正確に指定してください(スペルミスがあるとデータが挿入されません)
  • テンプレート全体のHTML構造は自由ですが、データ挿入用のクラス名を持つ要素は必須です

検索結果のCSS変更

サンプルCSSは参考として提供されています。実際のデザインは、お客様のサイト側のCSSで自由にカスタマイズしてください。

検索フォームのCSSクラス

CSSクラス名説明
.neodig-form-rootフォームのルート要素(サジェスト専用フォームで使用)
.neodig-search-root検索ルート要素
.neodig-search-wrapper検索入力とボタンのラッパー
.neodig-search-input検索入力フィールド
.neodig-search-button検索ボタン
.neodig-loadingローディング中の修飾クラス(検索ボタン・もっと見るボタンにプログレスサークルを表示)
.neodig-suggest-containerサジェストコンテナ
.neodig-suggest-itemサジェストアイテム
.neodig-suggest-item-hoverサジェストアイテムのホバー状態
.neodig-suggest-item-selectedサジェストアイテムの選択状態
.neodig-filter-barカテゴリと更新日時フィルタのラッパー
.neodig-categoriesカテゴリコンテナ
.neodig-category個別カテゴリ
.neodig-category-nameカテゴリ名
.neodig-category-itemsカテゴリアイテムのコンテナ
.neodig-category-items-wrapperカテゴリアイテムのラッパー
.neodig-category-item個別カテゴリアイテム
.neodig-category-item-labelカテゴリアイテムのラベル
.neodig-category-inputカテゴリの入力要素(チェックボックス、ラジオボタン)
.neodig-category-dropdownドロップダウン形式のカテゴリ
.neodig-freshness更新日時フィルタコンテナ
.neodig-freshness-label更新日時フィルタのラベル
.neodig-freshness-dropdown更新日時フィルタのドロップダウン
.neodig-validation-error検索キーワードの文字数エラー表示(自動生成)

音声入力のCSSクラス

対応ブラウザ(Chrome、Edge)では、検索入力フィールド内に音声入力ボタンが自動的に表示されます。Firefox等の非対応ブラウザやiOS端末ではボタンは表示されません。音声入力の認識言語は日本語(ja-JP)固定です。ブラウザ側でマイクの使用が恒久的にブロックされている場合、検索キーワード入力欄の下(.neodig-validation-error)に「マイクがブロックされています。ブラウザのサイト設定から許可してください。」と表示されます。音声入力ボタンが表示されない場合は、トラブルシューティングをご確認ください。

CSSクラス名説明
.neodig-search-input-container音声入力ボタン付き検索入力のラッパー(自動生成)
.neodig-search-input-with-voice音声入力ボタン用にパディングが調整された検索入力
.neodig-voice-button音声入力ボタン
.neodig-voice-active録音中の音声入力ボタン

検索結果のCSSクラス

CSSクラス名説明
.neodig-result-contents結果コンテンツのコンテナ
.neodig-recommendations-sectionおすすめコンテンツセクション
.neodig-recommendations-headerおすすめコンテンツヘッダー
.neodig-recommendations-itemsおすすめコンテンツアイテムのコンテナ
.neodig-recommendation-item個別おすすめコンテンツアイテム
.neodig-recommendation-titleおすすめコンテンツのタイトル
.neodig-recommendation-contentおすすめコンテンツのコンテンツ
.neodig-recommendation-imageおすすめコンテンツの画像
.neodig-recommendation-textおすすめコンテンツのテキスト部分
.neodig-recommendation-urlおすすめコンテンツのURL
.neodig-recommendation-summaryおすすめコンテンツのサマリー
.neodig-faq-sectionFAQセクション(検索結果と視覚的に分離するためのカード状コンテナ)
.neodig-faq-headerFAQセクションヘッダー(バッジ+ラベルのflexコンテナ)
.neodig-faq-badgeFAQセクションヘッダー先頭に表示されるバッジ
.neodig-faq-header-labelFAQセクションヘッダーのテキスト部分
.neodig-faq-itemsFAQ項目のコンテナ
.neodig-faq-item個別FAQ項目(カード状の外枠)
.neodig-faq-item-detailsアコーディオンを構成する <details> 要素
.neodig-faq-summary-rowアコーディオン見出し行(<summary>、質問タイトルを含む)
.neodig-faq-answer-rowアコーディオン展開時の回答エリア
.neodig-faq-answer-linkdetailUrl がある場合に回答エリア全体を包むリンク
.neodig-faq-titleFAQの質問タイトル
.neodig-faq-summaryFAQの回答抜粋
.neodig-faq-detail-linkFAQ詳細ページへの導線ラベル
.neodig-faq-more-areaFAQ「さらに表示」ボタンエリア
.neodig-results-section検索結果セクション
.neodig-results-header検索結果ヘッダー
.neodig-results-items検索結果アイテムのコンテナ
.neodig-result-item個別検索結果アイテム
.neodig-result-title検索結果のタイトル
.neodig-result-content検索結果のコンテンツ
.neodig-result-image検索結果の画像
.neodig-result-text検索結果のテキスト部分
.neodig-result-url検索結果のURL
.neodig-result-summary検索結果のサマリー
.neodig-result-last-modified最終更新日時
.neodig-result-generic-field1汎用フィールド1
.neodig-result-generic-field2汎用フィールド2
.neodig-result-generic-field3汎用フィールド3
.neodig-result-category-tagsカテゴリタグ一覧
.neodig-category-tag個別カテゴリタグ
.neodig-summary-expandable展開可能なサマリーのコンテナ
.neodig-summary-contentサマリーコンテンツ(line-clamp方式)
.neodig-summary-toggle-buttonサマリー展開/折りたたみボタン
.neodig-errorエラーメッセージ表示エリア
.neodig-retry-button検索エラー時の再試行ボタン(.neodig-error内に自動生成)
.neodig-image-previewサムネイル画像のホバー拡大プレビュー(body直下に自動生成)
.neodig-image-preview-visible拡大プレビュー表示中の修飾クラス
.neodig-next-area次へボタンのエリア
.neodig-more-buttonもっと見るボタン
.neodig-limit-message表示上限到達時のメッセージ
.neodig-scroll-top-areaトップへスクロールボタンのエリア
.neodig-scroll-top-buttonトップへスクロールボタン
.neodig-with-chat-buttonチャットボタン併用時の修飾クラス
.neodig-skeleton-containerスケルトンスクリーンのコンテナ(ローディング中に表示)
.neodig-skeleton-itemスケルトンスクリーンの個別アイテム
.neodig-skeleton-titleスケルトンのタイトルプレースホルダー
.neodig-skeleton-urlスケルトンのURLプレースホルダー
.neodig-skeleton-textスケルトンのテキストプレースホルダー
.neodig-skeleton-text-shortスケルトンの短いテキストプレースホルダー

AI検索のCSSクラス

CSSクラス名説明
.neodig-ai-search-sectionAI検索セクションのルート要素(HTMLに配置するdiv)
.neodig-ai-search-cardAI回答のカード状コンテナ
.neodig-ai-search-headerバッジとヘッダーラベルを含むヘッダー行
.neodig-ai-badgeヘッダー先頭に表示される「AI」バッジ
.neodig-ai-search-header-labelヘッダーのテキストラベル
.neodig-ai-search-answerAIが生成した回答本文(Markdownレンダリング結果を内包)
.neodig-ai-search-disclaimerAI回答の直下に表示される注意書き
.neodig-ai-citation-ref回答本文中の引用参照リンク([1]2…が変換されたアンカー)
.neodig-ai-citations引用元一覧のアコーディオン(<details>要素)
.neodig-ai-citations-header引用元一覧のアコーディオン見出し(<summary>要素)
.neodig-ai-citations-list引用元のリスト(<ol>要素)
.neodig-ai-citation-item個別の引用元アイテム
.neodig-ai-skeleton-card回答生成中に表示されるスケルトンカード
.neodig-ai-skeleton-headerスケルトンのヘッダー行
.neodig-ai-skeleton-badgeスケルトンのバッジプレースホルダー
.neodig-ai-skeleton-labelスケルトンのローディングメッセージ
.neodig-ai-skeleton-lineスケルトンの本文プレースホルダー(shimmerアニメーション付き)
.neodig-ai-skeleton-line-shortスケルトンの短い行プレースホルダー

トラブルシューティング

音声入力ボタンが表示されない

音声入力ボタンが表示されない場合、以下の点を確認してください。

1. ブラウザの対応状況

音声入力は Web Speech API に対応したブラウザ(Chrome、Edge)でのみ利用可能です。Firefox等の非対応ブラウザではボタンは表示されません。また、iOSでは全てのブラウザがWebKitエンジンを使用しており、Web Speech APIが正常に動作しないためボタンは表示されません。

2. HTTPS の使用

音声入力にはHTTPS接続が必要です(localhost を除く)。HTTP環境では音声入力は利用できません。

3. Permissions-Policy ヘッダーの確認

サーバーの Permissions-Policy HTTPレスポンスヘッダーで microphone がブロックされていると、音声入力ボタンは自動的に非表示になります。ブラウザのDevToolsコンソールに以下のメッセージが表示されている場合、この設定が原因です。

Voice input button is hidden because microphone access is blocked. Please check that the Permissions-Policy header allows microphone.

対処方法: サーバーの Permissions-Policy ヘッダーで microphone を許可してください。

Permissions-Policy: microphone=(self)

WAFやCDN、セキュリティモジュール(例: helmet、nuxt-security)がデフォルトで microphone=() を設定している場合があります。