目次
前提
全文検索システムのセットアップが完了しており、インデックス作成・TALONでの検索が実行出来ている事。
talon-insight-{バージョン}-all.jarファイルが以下の配置先に置かれている事。
| OS | 配置先 |
|---|---|
| Windows | {Fessインストールディレクトリ}\app\WEB-INF\lib\ |
| Linux | {Fessインストールディレクトリ}/app/WEB-INF/lib/ |
1. Fess スケジューラ設定
日次レポート・週次レポートを生成するための設定を行います。
Fess の管理画面からジョブを登録します。設定はすべて Groovy スクリプト内に記述します。
本ジョブは全文検索セットアップガイドの統合ジョブ(クロールジョブ)とは別に登録してください。クロール完了後に実行されるようスケジュールを調整してください。
1.1 ジョブの登録
- Fess 管理画面にアクセス(例: http://localhost:8081/admin/)
- システム → スケジューラ を開く
- 新規作成 をクリック
- 以下の内容で登録:
| 項目 | 設定値 |
|---|---|
| 名前 | TALON Insight 日次レポート |
| 対象 | all |
| スケジュール |
30 1 * * *(毎日 01:30) |
| 実行方法 | groovy |
| スクリプト | 下記参照 |
| ジョブログ | 有効 |
| クローラー | 無効 |
| 状態 | 有効 |
1.2 Groovy スクリプト
以下のスクリプトをスケジューラに登録します。 スクリプト上部の変数を環境に合わせて変更してください。analysisPrompt、outputFormat、rules は JSON テンプレート内を直接編集します。
// ============================================================
// パス設定(環境に合わせて変更)
// ============================================================
// ※ JAR ファイル名のバージョン部分は配布パッケージに合わせてください
// <version> は、 1.0.0 など、jarファイルのファイル名に記されたものを記載してください
// Docker 環境の場合:
// insightJar = "/usr/share/fess/app/WEB-INF/lib/talon-insight-<version>-all.jar"
// outputDir = "/opt/talon-insight/output"
//
// Linux の場合:
// insightJar = "<Fessのインストールフォルダ>/app/WEB-INF/lib/talon-insight-<version>-all.jar"
// outputDir = "/opt/talon-insight/output"
//
// Windows の場合:
// insightJar = "C:/fess/app/WEB-INF/lib/talon-insight-<version>-all.jar"
// outputDir = "C:/talon-insight/output"
// ============================================================
def insightJar = "/usr/share/fess/app/WEB-INF/lib/talon-insight-<version>-all.jar" // バージョンは配布パッケージに合わせる
def outputDir = "/opt/talon-insight/output"
def reportType = "daily" // "daily" または "weekly"
// ============================================================
// OpenSearch 接続設定
// ============================================================
def opensearchUrl = "http://localhost:9200" // ← OS直接の場合(Dockerの場合: http://opensearch:9200)
def opensearchIndex = "fess.search"
// ============================================================
// TALON 接続設定
// ============================================================
def talonBaseUrl = "http://host.docker.internal:8080/Talon" // Docker: "http://host.docker.internal:8080/Talon", OS直接: "http://localhost:8080/Talon" など
def talonUsername = "your_username"
def talonPassword = "your_password"
// ============================================================
// AI 分析設定(AI 分析を使わない場合は aiEnabled = false)
// ※ AI分析を利用するには Anthropic 社との API 利用契約が別途必要です
// ============================================================
def aiEnabled = true
def aiApiKey = "sk-ant-api03-xxxxx..." // Anthropic API キー
def aiModel = "claude-sonnet-4-6" // 使用するAIモデル
def aiMaxFuncs = 50 // AI分析対象の最大機能数(件数上位から選択)
def aiMaxTokens = 2048 // AIの応答の最大トークン数(長い分析が必要な場合は増やす)
def aiTemperature = 0.3 // 生成の温度(0.0〜1.0、低いほど安定、高いほど多様な出力)
// ============================================================
// 設定内容(config.json テンプレート)
// 上記の変数が自動で反映されます。
// analysisPrompt、outputFormat、rules は必要に応じて直接編集してください。
// ============================================================
def configJson = """{
"opensearch": {
"url": "${opensearchUrl}",
"index": "${opensearchIndex}"
},
"talon": {
"baseUrl": "${talonBaseUrl}",
"enabled": true,
"username": "${talonUsername}",
"password": "${talonPassword}",
"fetchMetadata": true
},
"output": {
"dir": "${outputDir}",
"format": ["html", "json"],
"aiSubDir": "ai"
},
"llm": {
"enabled": ${aiEnabled},
"provider": "anthropic",
"model": "${aiModel}",
"apiKey": "${aiApiKey}",
"maxFuncs": ${aiMaxFuncs},
"maxTokens": ${aiMaxTokens},
"temperature": ${aiTemperature},
"analysisPrompt": [
"あなたは業務データ分析の専門家です。",
"以下の業務機能のデータ分析結果を確認し、以下の観点で分析してください:",
"1. データ品質の問題点",
"2. 業務運用上のリスク",
"3. 改善提案(優先度付き)",
"回答は日本語で提供してください。"
],
"outputFormat": {
"insightsCount": "3〜5件",
"fields": {
"title": "洞察のタイトル(20文字以内)",
"description": "詳細な説明(100文字程度)",
"severity": "HIGH/MEDIUM/LOW/INFO から選択",
"category": "trend/anomaly/opportunity/risk から選択",
"recommendations": "推奨アクションの配列",
"relatedTerms": "関連するフィールド名の配列",
"confidence": "0〜1の数値で分析の確信度を表す",
"将来のリスク": "将来起きうるリスクを100字程度で説明",
"AIに出来る事": "当洞察についてAIが対応できる事を50字程度で説明"
}
}
},
"rules": {
"system": [
{
"id": "volume_spike",
"name": "件数急増検知",
"type": "statistical",
"enabled": true,
"metric": "doc_count",
"groupBy": "label",
"direction": "increase",
"period": "1d",
"baselinePeriod": "30d",
"threshold": { "type": "sigma", "value": 3 },
"severity": "warning"
},
{
"id": "volume_drop",
"name": "件数急減検知",
"type": "statistical",
"enabled": true,
"metric": "doc_count",
"groupBy": "label",
"direction": "decrease",
"period": "1d",
"baselinePeriod": "30d",
"threshold": { "type": "sigma", "value": 3 },
"severity": "warning"
},
{
"id": "no_update",
"name": "更新停止検知",
"type": "absence",
"enabled": true,
"groupBy": "label",
"period": "1d",
"minExpectedCount": 1,
"severity": "warning"
}
],
"business": [],
"ai_suggested": []
}
}"""
// ============================================================
// 実行(以下は変更不要)
// ============================================================
def configFile = File.createTempFile("talon-insight-config-", ".json")
try {
configFile.text = configJson
def pb = new ProcessBuilder(
"java", "-jar", insightJar,
"--config", configFile.absolutePath,
"--report", reportType,
"--all-labels"
)
pb.redirectErrorStream(true)
def process = pb.start()
def output = process.inputStream.text
def exitCode = process.waitFor()
if (exitCode != 0) {
throw new RuntimeException("talon-insight failed (exit=${exitCode}): ${output}")
}
return "talon-insight completed: ${output.take(1000)}"
} finally {
configFile.delete()
}
1.3 週次レポートの設定
週次レポートを実行する場合は、別途ジョブを作成し以下を変更します:
| 変更箇所 | 設定値 |
|---|---|
| 名前 | TALON Insight 週次レポート |
| スケジュール |
0 2 * * 1(毎週月曜 02:00) |
スクリプト内の reportType
|
"weekly" |
1.4 ラベル別処理
特定のラベルのみ分析する場合、ProcessBuilder のコマンドに --label を追加します:
def pb = new ProcessBuilder(
"java", "-jar", insightJar,
"--config", configFile.absolutePath,
"--report", reportType,
"--label", "営業管理"
)
設定された全ラベルを順次処理する場合は --all-labels を追加します:
def pb = new ProcessBuilder(
"java", "-jar", insightJar,
"--config", configFile.absolutePath,
"--report", reportType,
"--all-labels"
)
ラベル別に異なる認証情報を使用する場合は、configJson の talon セクションに labels を追加します:
"talon": {
"baseUrl": "http://host.docker.internal:8080/Talon",
"enabled": true,
"username": "default_user",
"password": "default_pass",
"labels": {
"営業管理": { "username": "sales_user", "password": "sales_pass" },
"顧客管理": { "username": "customer_user", "password": "customer_pass" }
}
}
パスワードの管理:
passwordの代わりにpasswordEnvを使うと、パスワードを JSON に直書きせず環境変数から読み取れます。passwordEnvの値は「読み取る環境変数の名前」です。ラベルごとに異なる環境変数名を指定します:"labels": { "営業管理": { "username": "sales_user", "passwordEnv": "TALON_SALES_PASSWORD" }, "顧客管理": { "username": "customer_user", "passwordEnv": "TALON_CUSTOMER_PASSWORD" } }この場合、環境変数を事前に設定しておきます:
export TALON_SALES_PASSWORD="sales_pass_xxx" export TALON_CUSTOMER_PASSWORD="customer_pass_xxx"
passwordとpasswordEnvの両方が設定されている場合はpassword(直接指定)が優先されます。Groovy スクリプトで JSON を直書きする運用ではpasswordで直接指定する方がシンプルです。
2. 設定パラメータリファレンス
Groovy スクリプトの configJson に設定するパラメータの一覧です。
2.1 opensearch(必須)
| パラメータ | 説明 | デフォルト |
|---|---|---|
url |
OpenSearch の URL | http://localhost:9200 |
index |
Fess のインデックス名 | fess.search |
username |
OpenSearch のユーザー名(Security Plugin 有効時) | 空 |
password |
OpenSearch のパスワード | 空 |
Docker 環境の場合:
urlはhttp://opensearch:9200(コンテナ名)を指定します。
インデックス名の確認:
curl http://localhost:9200/_cat/indices?v | grep fess
2.2 talon(オプション)
TALON REST API に接続して、機能名や項目仕様をレポートに表示します。
| パラメータ | 説明 | デフォルト |
|---|---|---|
baseUrl |
TALON アプリケーションの URL | - |
enabled |
TALON 連携を有効にする | true |
username |
デフォルトのユーザー名 | - |
password |
パスワード(直接指定) | - |
passwordEnv |
パスワードの環境変数名(password が空の場合に使用) |
- |
fetchMetadata |
機能メタデータ(項目仕様等)を取得する | false |
labels |
ラベルごとの認証情報(1.4 項 を参照) | - |
Docker 環境の場合:
baseUrlはhttp://host.docker.internal:8080/Talonのようにホストマシンの URL を指定します。
2.3 output(必須)
| パラメータ | 説明 | デフォルト |
|---|---|---|
dir |
出力ディレクトリ | ./output |
format |
出力形式(html, json または両方) |
["html", "json"] |
aiSubDir |
AI 分析セッションの出力サブディレクトリ | ai |
2.4 rules(オプション)
3 種類のルールを設定できます。
| ルール種別 | 説明 |
|---|---|
system |
システム標準ルール(件数異常、更新停止) |
business |
企業固有ルール(カスタムクエリ) |
ai_suggested |
AI が提案したルール |
ルールタイプ:
| タイプ | 説明 | 用途 |
|---|---|---|
statistical |
σ(標準偏差)超過による異常検知 | 件数の急増・急減を検知 |
absence |
更新停止検知 | 一定期間更新がないラベルを検知 |
query |
カスタムクエリによるカウント | 任意の条件に一致するデータの検知 |
query ルールの例(business に追加):
"business": [
{
"id": "error_label_check",
"name": "エラーラベル検知",
"type": "query",
"enabled": true,
"query": { "term": { "label": "エラーデータ" } },
"message": "エラーラベルのデータが {count} 件存在します",
"severity": "critical"
}
]
2.5 llm(オプション)
Claude API を使用した AI 分析機能です。有効にすると、インデックスデータの統計情報を AI が分析し、データ品質の問題点や業務運用上のリスク、改善提案などの洞察を自動生成します。AI 分析を使用しない場合は enabled: false に設定してください(ルール検知・統計集計のレポートは AI 分析なしでも生成されます)。
注意: この機能を利用するには、別途 Anthropic 社との API 利用契約が必要です。API キーの設定方法は 2 通りあります:
- Groovy スクリプトの変数に直接記入(推奨): スクリプト上部の
aiApiKeyに API キーを設定します- 環境変数を使用: Fess サーバの環境変数
ANTHROPIC_API_KEYに設定し、Groovy スクリプトのaiApiKeyを空文字""にします(apiKeyEnvのデフォルト値ANTHROPIC_API_KEYから自動で読み取られます)AIの学習には使用されません
当サービスはAPI経由で生成AIサービスに接続します。Claude APIは、利用規約により「APIを通じて送信されたデータはモデルの学習には使用しない」と明記されています。お客様の業務データがAIの学習に使用されて流出する心配はありません。
基本パラメータ:
| パラメータ | 説明 | デフォルト |
|---|---|---|
enabled |
AI 分析を有効にする | false |
provider |
LLM プロバイダ | anthropic |
model |
使用するモデル(Anthropic の最新モデル名を指定) | -(有効にする場合は必須) |
apiKey |
API キー(直接指定) | - |
apiKeyEnv |
API キーの環境変数名(apiKey が空の場合に使用) |
ANTHROPIC_API_KEY |
maxTokens |
AI の応答の最大トークン数 | 2048 |
temperature |
生成の温度パラメータ | 0.3 |
analysisPrompt |
分析プロンプト(文字列または文字列の配列) | デフォルトプロンプト |
maxTokens(最大トークン数)について: AI が 1 回のリクエストで生成できる応答の最大長を制御します。1 トークンは日本語で約 1〜2 文字に相当します。
2048(デフォルト): 一般的な分析には十分な長さです4096: より詳細な分析や多くの洞察を生成したい場合に設定- 値を大きくするとより詳しい分析が得られますが、API の利用コストが増加します
temperature(温度)について: AI の出力のランダム性を制御するパラメータです。0.0〜1.0 の範囲で指定します。
0.0〜0.3: 安定した一貫性のある出力(データ分析に推奨)0.3(デフォルト): 安定性と多様性のバランス0.5〜0.7: より多様で創造的な出力0.8〜1.0: 非常にランダムな出力(分析用途には非推奨)業務データの分析にはデフォルトの
0.3を推奨します。同じデータに対して毎回異なる視点の分析が欲しい場合は0.5程度に上げてください。
analysisPrompt(分析プロンプト)について: AI に渡す分析指示を自由にカスタマイズできます。文字列または文字列の配列(改行で結合されます)で指定します。プロンプトの内容によって AI が生成する洞察の品質や観点が大きく変わるため、業務に合わせた調整が効果的です。
- デフォルト: 一般的な業務データ分析(傾向、異常、改善提案)
- 業種や業務に特化した観点を指示すると、より有用な分析が得られます
- 例: 法務部門なら「コンプライアンスリスクの観点で分析してください」等
分析対象パラメータ:
| パラメータ | 説明 | デフォルト |
|---|---|---|
significantTermsFields |
特徴語抽出の対象フィールド | ["label", "func_id", "content"] |
significantTermsSize |
抽出する特徴語の数 | 10 |
sampleSize |
サンプルドキュメント数 | 5 |
maxFuncs |
AI 分析対象の最大機能数(件数上位から選択) | 50 |
maxDocsPerFunc |
機能あたりの最大ドキュメント数(-1 で無制限) | -1 |
maxFuncs(最大機能数)について: AI 分析の対象となる機能(func_id)の数を制限します。ドキュメント件数の多い順に上位 N 件が選ばれます。
50(デフォルト): 中〜大規模な環境に適切- 機能数が多い環境では、この値を下げることで処理時間と API コストを削減できます
- AI 分析は機能ごとに 1 回の API リクエストを送信するため、機能数に比例してコストが増加します
outputFormat(出力フォーマット指定):
AI が生成する洞察の構造を定義します。fields には任意の項目を追加・変更できます。
| パラメータ | 説明 |
|---|---|
insightsCount |
生成する洞察の件数(例: "3〜5件") |
fields |
洞察に含めるフィールドの定義(キー: フィールド名、値: AI への指示) |
fields に設定したフィールド名と指示がそのまま AI へのプロンプトに組み込まれ、レポートに反映されます。業務に応じて自由にカスタマイズできます。
3. 出力結果
3.1 ディレクトリ構成
--all-labels で実行した場合、ラベルごとにサブフォルダが作成され、その下に日付フォルダと AI セッションフォルダが配置されます。
output/
├── 営業管理/
│ ├── 2026-02-26/
│ │ ├── 営業管理_2026-02-26_report.html # 日次 HTML レポート
│ │ └── 営業管理_2026-02-26_data.json # 日次 JSON データ
│ ├── 2026-02-24/
│ │ ├── 営業管理_2026-02-24_weekly-report.html # 週次 HTML レポート
│ │ └── 営業管理_2026-02-24_weekly-data.json # 週次 JSON データ
│ └── ai/ # AI 分析セッションデータ
│ └── 2026-02-26_013012/
│ ├── ai-prompt-function-FUNC001.txt
│ └── ai-prompt-function-FUNC002.txt
├── 顧客管理/
│ ├── 2026-02-26/
│ │ ├── 顧客管理_2026-02-26_report.html
│ │ └── 顧客管理_2026-02-26_data.json
│ └── ai/
│ └── ...
└── ...ラベルを指定しない場合は、ラベルのサブフォルダなしで output/ 直下に日付フォルダが作成されます:
output/
├── 2026-02-26/
│ ├── 2026-02-26_report.html
│ └── 2026-02-26_data.json
└── ai/
└── ...3.2 レポート内容
日次レポート(HTML):
- 総ドキュメント数・更新ドキュメント数
- ルール検知によるアラート一覧(Critical / Warning / Info)
- ラベル別・機能ID 別の件数集計(TALON 連携時は機能名・カテゴリ・項目数も表示)
- 機能別更新傾向(過去7日間)
- カテゴリ別集計
-
AI 洞察・特徴語(LLM 有効時)
週次レポート(HTML):
- 今週の更新件数
- 前週比較(増減・トレンド)
4. レポートビューア(Web UI)
TALON Insight のレポートを Fess の Web サーバー上でブラウザから閲覧できます。
4.1 アクセス方法
Fess が起動している状態で、以下の URL にアクセスします:
http://<Fessサーバー>:8081/insight/Docker 環境の場合:
http://localhost:8081/insight/
4.2 URL 一覧
| URL | 説明 |
|---|---|
/insight/ |
レポート一覧(直近2週間) |
/insight/archive |
月別アーカイブ一覧 |
/insight/archive/{yyyy}/{MM} |
指定月のレポート一覧 |
/insight/view/{label}/{date}/{file} |
ラベル別レポート表示 |
/insight/view/{date}/{file} |
全体レポート表示 |
4.3 ページ構成
トップページ(/insight/):
直近2週間のレポートが表示されます。ラベルごとにカードが分かれ、日付・日次・週次の各レポートへのリンク(HTML / JSON)が一覧表示されます。2週間より前のレポートがある場合は「過去のレポート」リンクが表示されます。
月別アーカイブ(/insight/archive):
過去のレポートを月単位で閲覧できます。月を選択すると、その月のレポート一覧が表示されます。
4.4 セットアップ
レポートビューアは talon-insight-*-all.jar に含まれるサーブレットとして動作します。
Docker 環境の場合:
追加設定は不要です。配布パッケージの talon-entrypoint.sh が Fess 起動時にサーブレットを自動登録します。
OS 直接インストールの場合:
{Fessインストールディレクトリ}/app/WEB-INF/web.xml の最後部分にサーブレット定義を追加します:
<!-- TALON Insight レポートビューア -->
<servlet>
<servlet-name>insightReport</servlet-name>
<servlet-class>jp.co.hoipoi.talon.insight.web.InsightReportServlet</servlet-class>
<init-param>
<param-name>outputDir</param-name>
<param-value>/opt/talon-insight/output</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>insightReport</servlet-name>
<url-pattern>/insight/*</url-pattern>
</servlet-mapping>
</web-app> <!-- ← この閉じタグは既存のものです。この直前に上記を追加します -->Windows の場合:
param-valueを環境に合わせて変更してください(例:C:/talon-insight/output)。 このパスは Groovy スクリプトのoutputDir変数と同じパスを指定する必要があります。注意: 追加後は Fess の再起動が必要です。
4.5 レポート画面イメージ
トップページイメージ
日次レポートイメージ
AI分析を実施した場合は以下のようにAIによる分析が出力されます。