全文検索でnRedmineをnさらに活用!

: author

須藤功平

: institution

株式会社クリアコード

: content-source

Redmine大阪 第17回勉強会

: date

2017-08-26

: allotted-time

50m

: theme

groonga

よく活用されたRedmine

(('tag:center')) (('tag:x-large')) 情報の宝庫

* (('wait'))問題解決の経緯
* (('wait'))Wikiに整理したノウハウ

さらに活用するために

* 必要なときに
* 必要な情報に
* 素早くアクセスしたい!

活用方法:検索!

# image
# src = images/redmine-search.png
# relative_width = 90
# reflect_ratio = 0.1

活用の壁

* よく活用されたRedmine
  * 大量の情報(ただし((*玉石混合*)))
* (('wait'))さらに活用するための課題
  * 大量→必要な情報を見つけにくい
  * 大量→探す時間が増える

課題例1:検索ノイズが多い

# image
# src = images/redmine-search-noise.svg
# relative_height = 100
# reflect_ratio = 0.1

課題例2:検索が遅い

* (('wait'))本当に大量だとね!
* (('wait'))↓これくらいだと遅くない
  * チケット数:4049
  * コメント数:41264
  * Wikiページ数:1081
  * 1秒以内に返ってくる\n
    (('note:キャッシュが効く:0.1sくらい'))\n
    (('note:キャッシュが効かない:0.7sくらい'))

解決策

Groongaでn Redmineをn 高速・高精度n 全文検索

解決例1:検索ノイズがない

# image
# src = images/redmine-search-no-noise.svg
# relative_height = 100
# reflect_ratio = 0.1

検索ノイズ?

* 上位N件でがっかりする?
  * がっかり→ノイズ多い
  * ユーザーは上位N件しか確認しない
  * Groongaはスコアを調整してソート
* 件数は関係ない
  * 実はこの例ではヒット件数は同じ

解決例2:検索が速い

* ↓これくらいだと誤差
  * チケット数:4049
  * コメント数:41264
  * Wikiページ数:1081
  * 参考:\n
    既存(キャッシュあり)と\n
    Groonga(キャッシュなし)が\n
    同じくらい

200万チケットのケース

(('note:twitter.com/akahane92/status/733832496945594368'))

# image
# src = images/redmine-search-speed.png
# relative_height = 100
# reflect_ratio = 0.1

ここまでのまとめ

* Redmineをさらに活用したい!
  * 素早く必要な情報にアクセス!
  * 検索をがんばらないと!
* Groongaで全文検索!
  * 検索ノイズが少ない!
  * 速い!

ここからの話

導入したくなる情報を紹介

インストール:RDBMS

* 対応RDBMS
  * MySQLもPostgreSQLも!
* RDBMSにGroonga対応\n
  プラグインをインストール\n
  (('note:プラグイン:別途サービス管理不要→運用コスト増加なし'))
  * MySQL:Mroonga
  * PostgreSQL:PGroonga

インストール:Mroonga

(('tag:center')) (('note:mroonga.org/ja/docs/install.html'))

* パッケージで簡単インストール
* 対応プラットフォーム
  * Debian GNU/Linux, Ubuntu
  * CentOS Fedora
  * macOS
  * Windows

インストール:PGroonga

(('tag:center')) (('note:pgroonga.github.io/ja/install/'))

* パッケージで簡単インストール
* 対応プラットフォーム
  * Debian GNU/Linux, Ubuntu
  * CentOS Fedora
  * macOS
  * Windows

インストール:プラグイン

% cd redmine
% git clone \
    https://github.com/okkez/redmine_full_text_search.git \
    plugins/full_text_search
% bin/rake redmine:plugins RAILS_ENV=production

(('tag:center')) 再起動で完了!

高度な検索1:AND/OR/NOT

* キーワード単位でのAND/OR/NOT
  * 従来:AND/ORのみ
  * 従来:キーワード全体で切り替え
* 例:
  * (Groonga OR Mroonga) -PostgreSQL
  * GroongaまたはMroongaを含むが\n
    PostgreSQLは含まない

高度な検索2:並び順の変更

* ソート対象:スコア・更新時刻
  * 従来:更新時刻のみ
* ソート順:昇順・降順
  * 従来:降順のみ

並び順の変更UI

# image
# src = images/redmine-search-sort-options.png
# relative_height = 100
# reflect_ratio = 0.1

ここまでのまとめ

* 簡単にインストールできる
  * 運用も楽
* AND/OR/NOTを使える
  * 絞り込みに便利
* 並び順をカスタマイズできる
  * スコアと更新時刻で十分

2017年5月以降の話

* redmine.tokyo 第12回勉強会
  * 2017年5月
  * ノイズが少なくて高速
* その後
  * 高速化
  * 類似issue検索対応

高速化

* 旧
  * LIKE検索をGroongaに置き換え
  * 他の条件はそのまま
* 新
  * すべてGroongaで検索
  * 高速・柔軟・高度な検索をサポート

データの扱い

* 旧
  * 正規化してデータを保存
  * 検索時に複数回のSELECT
* 新
  * 1つのテーブルにデータを保存
  * 1回のSELECTで検索(((*速い*)))

柔軟

* ドリルダウンで対象を分別
  * チケットn件・Wikiページn件とか
  * 標準でもあるやつ
* ハイライト・スニペット
  * 標準よりもいい感じ
* 類似文書検索

類似文書検索

(('tag:center')) (('tag:x-large')) (('tag:margin-bottom * 3')) 活用例

* 類似issue検索
  * 実装着手
* 類似Wiki検索
  * 未実装

類似issue検索

# image
# src = images/similar-issues.png
# relative_height = 95
# reflect_ratio = 0.1

類似issue:ユースケース

* 新しい問題が発生!
* あれ?どこかで見たような…
* プラグイン:
  * 「このissue、似ていませんか?」
* →問題の早期解決!

類似issue検索:現実装

* issue閲覧時
  * 自動で類似issueを提示
* Groonga内のデータを活用
  * テキストデータで類似文書検索
* 精度
  * まぁまぁ

ここからの話

今後の野望

類似issue検索精度向上nメタデータを活用

* 手動設定の関連issue情報使用
* 属性情報使用
  * カテゴリとかトラッカーとか
* 同一プロジェクトに限定する
* Wikiも対象に加える

類似issue検索精度向上n機械学習技術を活用

* 字面でなく意味で類似文書検索
  * 例:メールのthreadとプログラムのthreadは違う
  * 例:MroongaでMySQLも類似度向上
* 回答の自動生成\n
  (('note:RNNを用いた機械翻訳とか'))
  * 類似issueの結論を探さなくてよい

データ活用に向けて

* GroongaにPython組込
* Rubyでデータ処理
  * Red Data Tools
* Apache Arrow
  * 次世代データ交換フォーマット
  * コミッターになった!

類似issuen共同開発組織募集

* 精度向上にはデータが不可欠
* データを持っていそうな組織
  * 大量ユーザー・長期間運用組織
  * マネージドサービス提供組織
* Redmine内データを活用したい\n
  組織はぜひ!

添付ファイル内全文検索

* 現状:ファイル名と説明
* テキスト抽出できれば検索可能
  * テキスト抽出ツール例:ChupaText\n
    (('note:Groongaプロジェクトのテキスト抽出ツール'))

添付ファイル内全文検索n実装案

* テキスト抽出部分をプラグインできるようにすればRedmine本体に入れられるのでは!?
  * ChupaTextよりApache Tikaを使いたい人もいそう
  * 検索はLIKEでよい\n
    (('note:Groongaプラグインを入れたら高速になる、でよい'))
* だれかチャレンジしない?

入力補完

* 検索ボックス
  * 入力に応じてキーワードを随時提示
  * ↑ヒットするもののみ
* 各種入力欄(タイトルなど)
  * 入力に応じて既存内容を随時提示
  * ローマ字でインクリメンタルサーチ

入力補完:ユースケース

* 検索ボックス
  * 自然と適切な検索に誘導!
  * 例:typoを防ぐ・表記揺れを吸収
* 各種入力欄
  * 自然と表記を統一!
  * →検索しやすい・理解しやすい
  * 例:typoを防ぐ・表記揺れを吸収

入力補完:実装

* Groonga内のデータを活用
  * どのくらいヒットするキーワード?
  * ログも活用:検索頻度は?
  * メタデータも活用:\n
    プロジェクト・トラッカー毎に\n
    文脈をわける
* 開発協力者を募集
  * 実装・データ提供・発注など

同義語展開

* 表記揺れを吸収
  * 例:「打ち合わせ」・「打合せ」
  * 吸収:「打ち合わせ OR 打合せ」
* 同義語は管理が大変!
  * 文脈で異なる!増減する!
  * 同義語管理を支援
  * 例:同義語候補を自動生成

同義語展開:ユースケース

* 検索ボックス
  * 欲しい情報にたどり着ける!
  * 表記揺れによる未発見を解消
* 同義語管理のコスト削減
  * Redmine内のデータを\n
    より低コストで有効活用!

同義語展開:実装

* Groongaの組み込み機能を活用
  * 高速に同義語展開が可能
* 同義語候補を機械学習
  * Groonga内のデータを活用
* 開発協力者を募集
  * 実装・データ提供・発注など

スマートナビ(仮)

* 言わなくても欲しいものを提示
  * 例:駅の近くでスマホを見る\n
    →その駅の時刻表を((*自動で*))表示
  * ポイント:ユーザーは\n
    「駅名 時刻表」で\n
    ((*明示的に*))検索して((*いない*))!

スマートナビ:ユースケース

* .oO(打ち合わせのアジェンダをWikiにまとめておこう)
  * Redmine:ホーム画面に該当Wikiページのリンクを表示

スマートナビ:実装

* 行動履歴から知識を学習
  * 打ち合わせ前にいつもWikiを更新
* 内容から事実を収集
  * Wikiページ内のテキスト\n
    「参加者:○○…」から抽出
* 開発協力者を募集
  * 実装・データ提供・発注など

ここまでのまとめ

* このプラグインの現状
  * Redmineの不便を解消\n
    (マイナスを少しプラスに)
* このプラグインの今後
  * Redmineをさらに有効活用!\n
    (少しプラスをすごくプラスに)

ここからの話

Redmineの開発にn 参加しよう!

開発に参加?

* Redmine本体のコードを書く\n
  ((*だけじゃない*))
  * バグレポート・テスト・issue対応
  * ドキュメント作成・宣伝
* プラグインを作る\n
  ((*だけじゃない*))
  * 本体と同様↑のことも大事な開発

開発の参加例

* Groongaプラグイン開発時の\n
  知見をフィードバック
  * Defect #21993: サイズ上限が小
  * Patch #23153: フックを追加
  * Feature #25198: スコアを表示

敷居が高そう?

* OSS Gateワークショップへ\n
  参加してみよう
  * 「OSS開発に参加」を経験できる\n
    (('note:(Redmineもプラグインの多くもOSS!)'))\n
    (('note:(もちろんこのプラグインもGroongaもOSS!)'))
  * https://oss-gate.doorkeeper.jp/

添付ファイル内全文検索をn実装したい!

私に相談だ!

まとめ

* Redmineをさらに活用するなら\n
  Groongaプラグインを使おう!
* Redmineの開発に参加しよう!
  * OSS Gateワークショップが役立つ
* 宣伝:全文検索のことは\n
  クリアコードに相談しよう!