SlideShare a Scribd company logo
1 of 82
Download to read offline
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PostgreSQLとPGroongaで
作る
PHPマニュアル
高速全文検索システム
須藤功平 クリアコード
PHPカンファレンス2017
2017-10-08
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHPマニュアル
http://php.net/manual/ja/
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
@で検索
@:エラー制御演算子
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
@でnot found
関数・クラス・例外のみ検索対象
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
全文検索あり!
Googleカスタム検索
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
@でnot found
Googleは自然言語向けだから
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マニュアル検索
自然言語向けと傾向が違う
@:自然言語ではノイズ
特に日本語ではノイズ
@:マニュアルでは重要語
プログラミング言語用の
チューニングが必要
欲しい情報が見つかる!
マニュアル
検索システムの
作り方
PHP
+
PostgreSQL
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PostgreSQLと全文検索
LIKE:組込機能
textsearch:組込機能
pg_trgm:標準添付
アーカイブには含まれている
別途インストールすれば使える
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
LIKE
少ないデータ
十分実用的
400文字×20万件くらいなら1秒とか
少なくないデータ
性能問題アリ
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHPマニュアルのデータ
件数 13095
平均文字数 871文字
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHPマニュアルでLIKE
速度は十分実用的
LIKE '%@%'で約100ms
それっぽい順のソート不可
全文検索ではソート順が重要
ユーザーは先頭n件しか見ない
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
textsearch
インデックスを作るので速い
言語毎にモジュールが必要
英語やフランス語などは組込
日本語は別途必要
日本語用モジュール
公式にはメンテナンスされていない
forkして動くようにしている人はいる
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
pg_trgm
インデックスを作るので速い
注:ヒット件数が増えると遅い
注:テキスト量が多いと遅い
注:1,2文字の検索は遅い(米・日本)
日本語を使うにはひと工夫必要
C.UTF-8を使う
ソースを変更してビルド
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
プラグイン
pg_bigm
pg_trgmの日本語対応強化版
それっぽい順のソート不可
PGroonga
本気の全文検索エンジンを利用
速いし日本語もバッチリ!
それっぽい順のソート可
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
ベンチマーク:pg_bigm
0
0.5
1
1.5
2
2.5
3
311 14706 20389
Data: Japanese Wikipedia
(Many records and large documents)
N records: About 0.9millions
Average text size: 6.7KiB
Slow
Slow
Elapsedtime(sec)
(Lowerisbetter)
N hits
pg_bigm
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
ベンチマーク:PGroonga
0
0.5
1
1.5
2
2.5
3
311 14706 20389
Data: Japanese Wikipedia
(Many records and large documents)
N records: About 0.9millions
Average text size: 6.7KiB
Fast Fast
Elapsedtime(sec)
(Lowerisbetter)
N hits
PGroonga pg_bigm
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PostgreSQLで全文検索システム
PostgreSQLで全文検索
PGroongaがベスト!
PGroonga
高速
日本語対応
それっぽい順でソート可
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHP document search
PHP + PostgreSQL + PGroonga
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
基本機能
高速全文検索+ソート
検索キーワードハイライト
キーワード周辺テキスト表示
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
高度な機能
オートコンプリート
ローマ字対応(seiki→正規表現)
類似マニュアル検索
同義語展開
「@」→「@ OR エラー制御演算子」
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
作り方:ツール
フレームワーク
Laravel
RDBMS
PostgreSQL
高速日本語全文検索機能
PGroonga
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
作り方:インストール
Laravel
省略
PostgreSQL
パッケージで
PGroonga
パッケージで
https://pgroonga.github.io/ja/install/
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
初期化:Laravel
% laravel new php-document-search
% cd php-document-search
% editor .env
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
初期化:データベース
% sudo -u postgres -H 
createdb php_document_search
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
初期化:PGroonga
-- ↓を実行する必要がある
CREATE EXTENSION pgroonga;
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
初期化:PGroonga
マイグレーションファイル作成
% php artisan 
make:migration enable_pgroonga
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション
public function up()
{
DB::statement("CREATE EXTENSION pgroonga;");
// CREATE EXTENSION IF NOT EXISTS ...の方がよい
}
public function down()
{
DB::statement("DROP EXTENSION pgroonga;");
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
モデル作成
マニュアルをモデルにする
名前:Entry
1ページ1インスタンス
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
モデル作成
% php artisan 
make:model 
--migration 
--controller 
--resource 
Entry
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション
Schema::create("entries", function ($table) {
$table->increments("id");
$table->text("url");
$table->text("title");
$table->text("content");
// PGroongaインデックス(デフォルト:全文検索用)
// 主キー(id)も入れるのが大事!
// それっぽい順のソートで必要
$table->index(
["id", "title", "content"], null, "pgroonga");
});
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
データ登録
PHPのドキュメントを
ローカルで生成
PHPのドキュメントの作り方
http://doc.php.net/tutorial/
フィードバックチャンスが
いろいろあったよ!
1.
ページ毎にPostgreSQLに挿入2.
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
コマンド作成
% php artisan 
make:command 
--command=doc:register 
RegisterDocuments
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
登録コマンド実装(一部)
public function handle()
{
foreach (glob("public/doc/*.html") as $html_path) {
$document = new DOMDocument();
@$document->loadHTMLFile($html_path);
$xpath = new DOMXPath($document);
$entry = new Entry();
$entry->url = "/doc/" . basename($html_path);
// XPathでテキスト抽出
$this->extract_title($entry, $xpath);
$this->extract_content($entry, $xpath);
$entry->save();
}
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
登録
% php artisan doc:register
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
検索用コントローラー
public function index(Request $request)
{
$query = $request["query"];
$entries = Entry::query()
// ↓はモデルに作る(後述)
->fullTextSearch($query)
->limit(10)
->get();
return view("entry.search.index",
["entries" => $entries,
"query" => $query]);
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
検索対象モデル
public function
scopeFullTextSearch($query, $search_query)
{
if ($search_query) {
return ...; // クエリーがあったら検索
} else {
return ...; // なかったら適当に返す(省略)
}
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
検索対象モデル:検索
return $query
->select("id", "url")
// それっぽさの度合い
->selectRaw("pgroonga_score(entries) AS score")
// キーワードハイライト
->highlightHTML("title", $search_query)
// キーワード周辺のテキスト(キーワードハイライト付き)
->snippetHTML("content", $search_query)
// タイトルと本文を全文検索(タイトルの方が重要)
->whereRaw("title &@~ ? OR content &@~ ?",
[">($search_query)", $search_query])
// それっぽい順に返す
->orderBy("score", "DESC");
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
キーワードハイライト
public function scopeHighlightHTML($query,
$column,
$search_query)
{
return $query
// PGroonga提供ハイライト関数
->selectRaw("pgroonga_highlight_html($column, " .
// PGroonga提供クエリーからキーワードを抽出する関数
"pgroonga_query_extract_keywords(?)) " .
"AS highlighted_$column",
[$search_query]);
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
検索結果
<div class="entries">
@foreach ($entries as $entry)
<a href="{{ $entry->url }}">
<h4>
{{-- マークアップ済み! --}}
{!! $entry->highlighted_title !!}
<span class="score">{{ $entry->score }}</span>
</h4>
{{-- 周辺テキストはtext[](後で補足) --}}
@foreach ($entry->content_snippets as $snippet)
<pre class="snippet">{!! $snippet !!}</pre>
@endforeach
</a>
@endforeach
</div>
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
検索対象モデル:配列
public function getContentSnippetsAttribute($value)
{ // PostgreSQLは配列をサポートしているがPDOは未サポート
// '["...","..."]'という文字列になるのでそれを配列に変換
// ※これは回避策なのでPDOに配列サポートを入れたい!
return array_map(
function ($e) {
// 「"」が「"」になっているので戻す
return preg_replace('/(.)/', '$1', $e);
},
explode('","', substr($value, 2, -2)));
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
高速日本語全文検索!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート
必要なもの
候補用テーブル
候補のヨミガナ(カタカナ)
PGroonga!!!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
モデル作成
% php artisan 
make:model 
--migration 
--controller 
--resource 
Term
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション:カラム
Schema::create("terms", function ($table) {
$table->increments("id");
$table->text("term");
$table->text("label");
$table->text("reading"); // 本当は配列にしたい
$table->timestamps();
// インデックス定義(後述)
});
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション
インデックス1
$table->index([
// ヨミガナに対する前方一致RK検索用
// RK:ローマ字・カナ(後述)
DB::raw("reading " .
"pgroonga_text_term_search_ops_v2"),
], null, "pgroonga");
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション
インデックス2
// 候補に対するゆるい全文検索用(中間一致用)
DB::statement(
"CREATE INDEX terms_term_index " .
"ON terms " .
"USING pgroonga (term) " .
// ↓がポイント
// ※LaravelがWITHを未サポートなのでSQLで書いている
// ※回避策なのでLaravelにWITHサポートを入れたい!
"WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit')");
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
前方一致RK検索
日本語特化の前方一致検索
ローマ字・ひらがな・カタカナで
カタカナを前方一致検索できる
gy→ギュウニュウ
ぎ→ギュウニュウ
ギ→ギュウニュウ
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
候補モデル:検索
public function scopeComplete($query, $search_query)
{
return $query
->select("label")
->highlightHTML("label", $search_query)
// 前方一致RK検索
->whereRaw("reading &^~ :query OR " .
// ゆるい全文検索
"term &@~ :query",
["query" => $search_query])
->orderBy("label")
->limit(10);
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
コントローラー
public function index(Request $request)
{
$query = $request["query"];
// モデルに実装した検索処理を呼び出し
$terms = Term::query()->complete($query);
$data = [];
foreach ($terms->get() as $term) {
$data[] = [
"value" => $term->label,
"label" => $term->highlighted_label,
];
}
// JSONで候補を返す
return response()->json($data);
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
UI
$("#query").autocomplete({
source: function(request, response) {
$.ajax({
url: "/terms/", // コントローラー呼び出し
dataType: "json",
data: {query: this.term},
success: response
});
}
}).autocomplete("instance")._renderItem = function(ul, item) {
return $("<li>")
.attr("data-value", item.value) // 候補には生データを使う
.append(item.label) // ハイライトしたデータを表示
.appendTo(ul);
};
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
類似マニュアル検索
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
実現方法
類似検索用インデックスが必要
自然言語に合わせた処理で精度向上
日本語ならMeCabを活用
類似検索用の演算子を使う
類似検索クエリー
→対象マニュアルのテキスト全体
参考:全文検索クエリー
→キーワード
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
インデックス作成
マイグレーションファイル作成
% php artisan 
make:migration 
add_similar_search_index
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション
public function up()
{ // WITHを使っているのでDB::statementを使用
DB::statement(
"CREATE INDEX similar_search_index " .
"ON entries " .
// タイトルと内容を合わせたテキストをインデックス
// 理由1:タイトルも重要→対象に加えて精度向上
// 理由2:PostgreSQLが全文検索インデックスと
// 区別できるように
"USING pgroonga (id, (title || ' ' || content)) " .
// ポイント:MeCabを使う
"WITH (tokenizer='TokenMecab')");
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
類似検索:スコープ
public function scopeSimilarSearch($query, $text)
{
return $query
->select("id", "url", "title")
->selectRaw("pgroonga_score(entries) AS score")
// インデックス定義と同じ式↓を指定すること!
// title || ' ' || content
// &@*が類似検索の演算子
->whereRaw("(title || ' ' || content) &@* ?",
[$text])
->orderBy("score", "DESC");
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
類似検索:インスタンスメソッド
public function similarEntries()
{
return Entries::query()
// タイトルと内容がクエリー
->similarSearch("{$this->title} {$this->content}")
// 自分自身を除くこと!
->where("id", "<>", $this->id)
// 最も類似している3件のみ取得
->limit(3)
->get();
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
類似検索:使い方
@foreach ($entries as $entry)
<ol> {{-- ↓マニュアル毎に類似文書検索 --}}
@foreach ($entry->similarEntries() as $similarEntry)
<li>
<a href="{{ $similarEntry->url }}">
{{ $similarEntry->title }}
<span class="score">{{ $similarEntry->score }}</span>
</a>
</li>
@endforeach
</ol>
@endforeach
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
類似マニュアル検索
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
同義語展開
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
実現方法
同義語管理テーブルを作成
同義語を登録
同義語を展開して検索
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
モデル作成
% php artisan 
make:model 
--migration 
--controller 
--resource 
Synonym
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション:カラム
public function up() {
Schema::create('synonyms', function ($table) {
$table->increments('id');
$table->text('term'); // 展開対象の語
$table->text('synonym'); // 展開後の語
// 例:term: @, synonym: @
// 例:term: @, synonym: エラー制御演算子
// 「@」→「@ OR エラー制御演算子」
$table->timestamps();
// インデックス定義(後述)
});
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
マイグレーション
インデックス
$table->index(
// termで完全一致できるようにする設定
[DB::raw(
"term pgroonga_text_term_search_ops_v2")],
null,
"pgroonga");
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
同義語登録
シーダー作成
% php artisan 
make:seeder 
SynonymsTableSeeder
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
シーダー
public function run()
{
$synonyms = [
// @そのもので検索させないならこれはいらない
["term" => "@", "synonym" => "@"],
["term" => "@",
// synonymでは演算子を使える
// ">": 重要度を上げる演算子
"synonym" => ">エラー制御演算子"],
];
DB::table("synonyms")->insert($synonyms);
}
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
動作確認
SELECT pgroonga_query_expand(
'synonyms', -- テーブル名
'term', -- 展開対象語のカラム名
'synonym', -- 展開後の語のカラム名
'@'); -- 展開対象のクエリー
-- pgroonga_query_expand
-- ------------------------------
-- ((@) OR (>エラー制御演算子))
-- (1 row)
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
検索
whereRaw("title &@~ ? OR content &@~ ?",
[">({$search_query})", $search_query]);
// ↓クエリーをpgroonga_query_expand()で展開して利用
whereRaw(
"title &@~ pgroonga_query_expand(?, ?, ?, ?) OR " .
"content &@~ pgroonga_query_expand(?, ?, ?, ?)",
["synonyms", "term", "synonym", ">({$search_query})",
"synonyms", "term", "synonym", $search_query]);
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
同義語展開
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
おさらい:基本機能
高速全文検索+ソート
検索キーワードハイライト
キーワード周辺テキスト表示
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
おさらい:高度な機能
オートコンプリート
ローマ字対応(seiki→正規表現)
類似マニュアル検索
同義語展開
「@」→「@ OR エラー制御演算子」
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
開発者募集!
公式検索システム置き換え!?
必要そう:複数バージョン対応
必要そう:複数言語対応
マニュアルをさらによく!
検索を便利に!→ユーザー増加!
→フィードバックする人も増加!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
使いたい!
WEICさんが運用予定!
2017年10月中にリリース予定
URL: http://phpdocs.weic.co.jp/
宣伝(運用スポンサーの宣伝枠)
PHPエンジニア大募集!
業務時間内にこれの開発もできる!?
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHP document search情報
ソース
https://github.com/kou/php-document-
search
OSS
MITライセンス
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
まとめ
PostgreSQL + PGroonga
高速日本語全文検索サービスを
PHPで簡単に作れる!
開発者募集!
サービス提供予定 by WEIC!
URL: http://phpdocs.weic.co.jp/
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
MySQLでもできる?
MySQL・PostgreSQLだけで作る
高速でリッチな
全文検索システム
db tech showcase Tokyo 2017の資
料
PGroongaの代わりにMroongaを使う
SQLでの書き方だけでPHPの話はない
https://slide.rabbit-shocker.org/authors/kou/db-tech-
showcase-tokyo-2017/
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHP+MySQL+Mroonga入門
Groongaではじめる全文検索
https://grnbook-ja.tumblr.com/
著者:北市真
PHP+Mroonga入門の電子書籍
今はまだ無料!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
PHPの開発へ参加!
PHPの開発に参加しませんか?
例:PDO/LaravelのPostgreSQL関連
例:マニュアル生成まわり
例:PHP document search関連
やりたいけど自分はムリそう…
そんなことはないんですよ!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
OSS Gate
OSS Gate
OSS開発者を増やす取り組み
OSS Gateワークショップ
OSS開発未経験者を経験者にする
ワークショップ
PHPもOSS!
PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2
ワークショップ
このカンファレンス内で開催!
午後にこの部屋で開催(2時間45分)
参加希望者は私に声をかけて!
PHP関連のOSSの開発に
参加する人を増やそう!
今回だけで終わりにしないで
今回を始まりにしたい!

More Related Content

What's hot

PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)Masahiko Sawada
 
OSC北海道2014_JPUG資料
OSC北海道2014_JPUG資料OSC北海道2014_JPUG資料
OSC北海道2014_JPUG資料Chika SATO
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版Kouhei Sutou
 
Springを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしようSpringを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう土岐 孝平
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことMasahiko Sawada
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイドTakahiro Itagaki
 
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめPostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめOhyama Masanori
 
PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールMasahiko Sawada
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)NTT DATA Technology & Innovation
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努Insight Technology, Inc.
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法佐久本正太
 

What's hot (20)

PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
pg_bigmを用いた全文検索のしくみ(後編)
pg_bigmを用いた全文検索のしくみ(後編)pg_bigmを用いた全文検索のしくみ(後編)
pg_bigmを用いた全文検索のしくみ(後編)
 
pg_trgmと全文検索
pg_trgmと全文検索pg_trgmと全文検索
pg_trgmと全文検索
 
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
 
OSC北海道2014_JPUG資料
OSC北海道2014_JPUG資料OSC北海道2014_JPUG資料
OSC北海道2014_JPUG資料
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版
 
Springを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしようSpringを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいこと
 
問合せ最適化インサイド
問合せ最適化インサイド問合せ最適化インサイド
問合せ最適化インサイド
 
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめPostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめ
 
PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツール
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
 

Viewers also liked

Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析Kazutaka Tomita
 
モバイルするハニーポット無線LANアクセスポイント
モバイルするハニーポット無線LANアクセスポイントモバイルするハニーポット無線LANアクセスポイント
モバイルするハニーポット無線LANアクセスポイントNaoya Kaneko
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行gree_tech
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)Kosuke Kida
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Masahito Zembutsu
 
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチKazuaki KURIU
 
Phpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろうPhpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろうSyouta Tada
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!Kouhei Sutou
 
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介Fumiya Sakai
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムKouhei Sutou
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Yuuki Takezawa
 
Laravelを使ってみた
Laravelを使ってみたLaravelを使ってみた
Laravelを使ってみたJaeseop Jeong
 
Laravel の学び方と得られる学び
Laravel の学び方と得られる学びLaravel の学び方と得られる学び
Laravel の学び方と得られる学びMasaru Matsuo
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFumihiko Shiroyama
 
デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3Fumiya Sakai
 
JavaScriptから利用するFirebase
JavaScriptから利用するFirebaseJavaScriptから利用するFirebase
JavaScriptから利用するFirebaseTakuji Shimokawa
 
わかってるフレームワーク Laravel
わかってるフレームワーク Laravelわかってるフレームワーク Laravel
わかってるフレームワーク LaravelMasashi Shinbara
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説Fumiya Sakai
 

Viewers also liked (20)

Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析Apache sparkとapache cassandraで行うテキスト解析
Apache sparkとapache cassandraで行うテキスト解析
 
モバイルするハニーポット無線LANアクセスポイント
モバイルするハニーポット無線LANアクセスポイントモバイルするハニーポット無線LANアクセスポイント
モバイルするハニーポット無線LANアクセスポイント
 
PHP Version Up と AWS への移行
PHP Version Up と AWS への移行PHP Version Up と AWS への移行
PHP Version Up と AWS への移行
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
 
Phpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろうPhpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろう
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩
 
3 tips of Laravel
3 tips of Laravel3 tips of Laravel
3 tips of Laravel
 
Laravelを使ってみた
Laravelを使ってみたLaravelを使ってみた
Laravelを使ってみた
 
Laravel の学び方と得られる学び
Laravel の学び方と得られる学びLaravel の学び方と得られる学び
Laravel の学び方と得られる学び
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
 
デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3
 
JavaScriptから利用するFirebase
JavaScriptから利用するFirebaseJavaScriptから利用するFirebase
JavaScriptから利用するFirebase
 
わかってるフレームワーク Laravel
わかってるフレームワーク Laravelわかってるフレームワーク Laravel
わかってるフレームワーク Laravel
 
Laravel LT
Laravel LTLaravel LT
Laravel LT
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
 

Similar to PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム

Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Kouhei Sutou
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009Akio Ishida
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーKouhei Sutou
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!do_aki
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界Yoshinori Nakanishi
 
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?Kouhei Sutou
 
Spring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーションSpring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーションToshiaki Maki
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ Daisuke Ikeda
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016Takayuki Shimizukawa
 
Sohu邮箱的python经验
Sohu邮箱的python经验Sohu邮箱的python经验
Sohu邮箱的python经验Ryan Poy
 
20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyo20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyoichikaway
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12Ryuji Yamashita
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia鉄次 尾形
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 

Similar to PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム (20)

Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
MySQLとPostgreSQLと日本語全文検索 - Azure DatabaseでMroonga・PGroongaを使いたいですよね!?
 
Spring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーションSpring Rooで作るGWTアプリケーション
Spring Rooで作るGWTアプリケーション
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
Zabbix API
Zabbix APIZabbix API
Zabbix API
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Sohu邮箱的python经验
Sohu邮箱的python经验Sohu邮箱的python经验
Sohu邮箱的python经验
 
20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyo20120307 CakePHP Study in Tokyo
20120307 CakePHP Study in Tokyo
 
おしべめしべ
おしべめしべおしべめしべ
おしべめしべ
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 

More from Kouhei Sutou

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowKouhei Sutou
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Kouhei Sutou
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowKouhei Sutou
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアKouhei Sutou
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかKouhei Sutou
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataKouhei Sutou
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像Kouhei Sutou
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataKouhei Sutou
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Kouhei Sutou
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!Kouhei Sutou
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionKouhei Sutou
 

More from Kouhei Sutou (20)

RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache ArrowRubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
RubyKaigi 2022 - Fast data processing with Ruby and Apache Arrow
 
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのか
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory data
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
My way with Ruby
My way with RubyMy way with Ruby
My way with Ruby
 
Red Data Tools
Red Data ToolsRed Data Tools
Red Data Tools
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!
 
Improve extension API: C++ as better language for extension
Improve extension API: C++ as better language for extensionImprove extension API: C++ as better language for extension
Improve extension API: C++ as better language for extension
 
PGroonga & Zulip
PGroonga & ZulipPGroonga & Zulip
PGroonga & Zulip
 

PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム

  • 1. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム 須藤功平 クリアコード PHPカンファレンス2017 2017-10-08
  • 2. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHPマニュアル http://php.net/manual/ja/
  • 3. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 @で検索 @:エラー制御演算子
  • 4. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 @でnot found 関数・クラス・例外のみ検索対象
  • 5. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 全文検索あり! Googleカスタム検索
  • 6. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 @でnot found Googleは自然言語向けだから
  • 7. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マニュアル検索 自然言語向けと傾向が違う @:自然言語ではノイズ 特に日本語ではノイズ @:マニュアルでは重要語 プログラミング言語用の チューニングが必要 欲しい情報が見つかる!
  • 10. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PostgreSQLと全文検索 LIKE:組込機能 textsearch:組込機能 pg_trgm:標準添付 アーカイブには含まれている 別途インストールすれば使える
  • 11. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 LIKE 少ないデータ 十分実用的 400文字×20万件くらいなら1秒とか 少なくないデータ 性能問題アリ
  • 12. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHPマニュアルのデータ 件数 13095 平均文字数 871文字
  • 13. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHPマニュアルでLIKE 速度は十分実用的 LIKE '%@%'で約100ms それっぽい順のソート不可 全文検索ではソート順が重要 ユーザーは先頭n件しか見ない
  • 14. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 textsearch インデックスを作るので速い 言語毎にモジュールが必要 英語やフランス語などは組込 日本語は別途必要 日本語用モジュール 公式にはメンテナンスされていない forkして動くようにしている人はいる
  • 15. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 pg_trgm インデックスを作るので速い 注:ヒット件数が増えると遅い 注:テキスト量が多いと遅い 注:1,2文字の検索は遅い(米・日本) 日本語を使うにはひと工夫必要 C.UTF-8を使う ソースを変更してビルド
  • 16. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 プラグイン pg_bigm pg_trgmの日本語対応強化版 それっぽい順のソート不可 PGroonga 本気の全文検索エンジンを利用 速いし日本語もバッチリ! それっぽい順のソート可
  • 17. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 ベンチマーク:pg_bigm 0 0.5 1 1.5 2 2.5 3 311 14706 20389 Data: Japanese Wikipedia (Many records and large documents) N records: About 0.9millions Average text size: 6.7KiB Slow Slow Elapsedtime(sec) (Lowerisbetter) N hits pg_bigm
  • 18. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 ベンチマーク:PGroonga 0 0.5 1 1.5 2 2.5 3 311 14706 20389 Data: Japanese Wikipedia (Many records and large documents) N records: About 0.9millions Average text size: 6.7KiB Fast Fast Elapsedtime(sec) (Lowerisbetter) N hits PGroonga pg_bigm
  • 19. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PostgreSQLで全文検索システム PostgreSQLで全文検索 PGroongaがベスト! PGroonga 高速 日本語対応 それっぽい順でソート可
  • 20. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHP document search PHP + PostgreSQL + PGroonga
  • 21. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 基本機能 高速全文検索+ソート 検索キーワードハイライト キーワード周辺テキスト表示
  • 22. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 高度な機能 オートコンプリート ローマ字対応(seiki→正規表現) 類似マニュアル検索 同義語展開 「@」→「@ OR エラー制御演算子」
  • 23. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 作り方:ツール フレームワーク Laravel RDBMS PostgreSQL 高速日本語全文検索機能 PGroonga
  • 24. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 作り方:インストール Laravel 省略 PostgreSQL パッケージで PGroonga パッケージで https://pgroonga.github.io/ja/install/
  • 25. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 初期化:Laravel % laravel new php-document-search % cd php-document-search % editor .env
  • 26. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 初期化:データベース % sudo -u postgres -H createdb php_document_search
  • 27. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 初期化:PGroonga -- ↓を実行する必要がある CREATE EXTENSION pgroonga;
  • 28. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 初期化:PGroonga マイグレーションファイル作成 % php artisan make:migration enable_pgroonga
  • 29. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション public function up() { DB::statement("CREATE EXTENSION pgroonga;"); // CREATE EXTENSION IF NOT EXISTS ...の方がよい } public function down() { DB::statement("DROP EXTENSION pgroonga;"); }
  • 30. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 モデル作成 マニュアルをモデルにする 名前:Entry 1ページ1インスタンス
  • 31. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 モデル作成 % php artisan make:model --migration --controller --resource Entry
  • 32. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション Schema::create("entries", function ($table) { $table->increments("id"); $table->text("url"); $table->text("title"); $table->text("content"); // PGroongaインデックス(デフォルト:全文検索用) // 主キー(id)も入れるのが大事! // それっぽい順のソートで必要 $table->index( ["id", "title", "content"], null, "pgroonga"); });
  • 33. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 データ登録 PHPのドキュメントを ローカルで生成 PHPのドキュメントの作り方 http://doc.php.net/tutorial/ フィードバックチャンスが いろいろあったよ! 1. ページ毎にPostgreSQLに挿入2.
  • 34. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 コマンド作成 % php artisan make:command --command=doc:register RegisterDocuments
  • 35. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 登録コマンド実装(一部) public function handle() { foreach (glob("public/doc/*.html") as $html_path) { $document = new DOMDocument(); @$document->loadHTMLFile($html_path); $xpath = new DOMXPath($document); $entry = new Entry(); $entry->url = "/doc/" . basename($html_path); // XPathでテキスト抽出 $this->extract_title($entry, $xpath); $this->extract_content($entry, $xpath); $entry->save(); } }
  • 36. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 登録 % php artisan doc:register
  • 37. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 検索用コントローラー public function index(Request $request) { $query = $request["query"]; $entries = Entry::query() // ↓はモデルに作る(後述) ->fullTextSearch($query) ->limit(10) ->get(); return view("entry.search.index", ["entries" => $entries, "query" => $query]); }
  • 38. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 検索対象モデル public function scopeFullTextSearch($query, $search_query) { if ($search_query) { return ...; // クエリーがあったら検索 } else { return ...; // なかったら適当に返す(省略) } }
  • 39. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 検索対象モデル:検索 return $query ->select("id", "url") // それっぽさの度合い ->selectRaw("pgroonga_score(entries) AS score") // キーワードハイライト ->highlightHTML("title", $search_query) // キーワード周辺のテキスト(キーワードハイライト付き) ->snippetHTML("content", $search_query) // タイトルと本文を全文検索(タイトルの方が重要) ->whereRaw("title &@~ ? OR content &@~ ?", [">($search_query)", $search_query]) // それっぽい順に返す ->orderBy("score", "DESC");
  • 40. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 キーワードハイライト public function scopeHighlightHTML($query, $column, $search_query) { return $query // PGroonga提供ハイライト関数 ->selectRaw("pgroonga_highlight_html($column, " . // PGroonga提供クエリーからキーワードを抽出する関数 "pgroonga_query_extract_keywords(?)) " . "AS highlighted_$column", [$search_query]); }
  • 41. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 検索結果 <div class="entries"> @foreach ($entries as $entry) <a href="{{ $entry->url }}"> <h4> {{-- マークアップ済み! --}} {!! $entry->highlighted_title !!} <span class="score">{{ $entry->score }}</span> </h4> {{-- 周辺テキストはtext[](後で補足) --}} @foreach ($entry->content_snippets as $snippet) <pre class="snippet">{!! $snippet !!}</pre> @endforeach </a> @endforeach </div>
  • 42. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 検索対象モデル:配列 public function getContentSnippetsAttribute($value) { // PostgreSQLは配列をサポートしているがPDOは未サポート // '["...","..."]'という文字列になるのでそれを配列に変換 // ※これは回避策なのでPDOに配列サポートを入れたい! return array_map( function ($e) { // 「"」が「"」になっているので戻す return preg_replace('/(.)/', '$1', $e); }, explode('","', substr($value, 2, -2))); }
  • 43. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 高速日本語全文検索!
  • 44. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 オートコンプリート 必要なもの 候補用テーブル 候補のヨミガナ(カタカナ) PGroonga!!!
  • 45. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 モデル作成 % php artisan make:model --migration --controller --resource Term
  • 46. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション:カラム Schema::create("terms", function ($table) { $table->increments("id"); $table->text("term"); $table->text("label"); $table->text("reading"); // 本当は配列にしたい $table->timestamps(); // インデックス定義(後述) });
  • 47. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション インデックス1 $table->index([ // ヨミガナに対する前方一致RK検索用 // RK:ローマ字・カナ(後述) DB::raw("reading " . "pgroonga_text_term_search_ops_v2"), ], null, "pgroonga");
  • 48. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション インデックス2 // 候補に対するゆるい全文検索用(中間一致用) DB::statement( "CREATE INDEX terms_term_index " . "ON terms " . "USING pgroonga (term) " . // ↓がポイント // ※LaravelがWITHを未サポートなのでSQLで書いている // ※回避策なのでLaravelにWITHサポートを入れたい! "WITH (tokenizer='TokenBigramSplitSymbolAlphaDigit')");
  • 49. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 前方一致RK検索 日本語特化の前方一致検索 ローマ字・ひらがな・カタカナで カタカナを前方一致検索できる gy→ギュウニュウ ぎ→ギュウニュウ ギ→ギュウニュウ
  • 50. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 候補モデル:検索 public function scopeComplete($query, $search_query) { return $query ->select("label") ->highlightHTML("label", $search_query) // 前方一致RK検索 ->whereRaw("reading &^~ :query OR " . // ゆるい全文検索 "term &@~ :query", ["query" => $search_query]) ->orderBy("label") ->limit(10); }
  • 51. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 コントローラー public function index(Request $request) { $query = $request["query"]; // モデルに実装した検索処理を呼び出し $terms = Term::query()->complete($query); $data = []; foreach ($terms->get() as $term) { $data[] = [ "value" => $term->label, "label" => $term->highlighted_label, ]; } // JSONで候補を返す return response()->json($data); }
  • 52. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 UI $("#query").autocomplete({ source: function(request, response) { $.ajax({ url: "/terms/", // コントローラー呼び出し dataType: "json", data: {query: this.term}, success: response }); } }).autocomplete("instance")._renderItem = function(ul, item) { return $("<li>") .attr("data-value", item.value) // 候補には生データを使う .append(item.label) // ハイライトしたデータを表示 .appendTo(ul); };
  • 53. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 オートコンプリート!
  • 54. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 類似マニュアル検索
  • 55. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 実現方法 類似検索用インデックスが必要 自然言語に合わせた処理で精度向上 日本語ならMeCabを活用 類似検索用の演算子を使う 類似検索クエリー →対象マニュアルのテキスト全体 参考:全文検索クエリー →キーワード
  • 56. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 インデックス作成 マイグレーションファイル作成 % php artisan make:migration add_similar_search_index
  • 57. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション public function up() { // WITHを使っているのでDB::statementを使用 DB::statement( "CREATE INDEX similar_search_index " . "ON entries " . // タイトルと内容を合わせたテキストをインデックス // 理由1:タイトルも重要→対象に加えて精度向上 // 理由2:PostgreSQLが全文検索インデックスと // 区別できるように "USING pgroonga (id, (title || ' ' || content)) " . // ポイント:MeCabを使う "WITH (tokenizer='TokenMecab')"); }
  • 58. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 類似検索:スコープ public function scopeSimilarSearch($query, $text) { return $query ->select("id", "url", "title") ->selectRaw("pgroonga_score(entries) AS score") // インデックス定義と同じ式↓を指定すること! // title || ' ' || content // &@*が類似検索の演算子 ->whereRaw("(title || ' ' || content) &@* ?", [$text]) ->orderBy("score", "DESC"); }
  • 59. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 類似検索:インスタンスメソッド public function similarEntries() { return Entries::query() // タイトルと内容がクエリー ->similarSearch("{$this->title} {$this->content}") // 自分自身を除くこと! ->where("id", "<>", $this->id) // 最も類似している3件のみ取得 ->limit(3) ->get(); }
  • 60. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 類似検索:使い方 @foreach ($entries as $entry) <ol> {{-- ↓マニュアル毎に類似文書検索 --}} @foreach ($entry->similarEntries() as $similarEntry) <li> <a href="{{ $similarEntry->url }}"> {{ $similarEntry->title }} <span class="score">{{ $similarEntry->score }}</span> </a> </li> @endforeach </ol> @endforeach
  • 61. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 類似マニュアル検索
  • 62. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 同義語展開
  • 63. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 実現方法 同義語管理テーブルを作成 同義語を登録 同義語を展開して検索
  • 64. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 モデル作成 % php artisan make:model --migration --controller --resource Synonym
  • 65. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション:カラム public function up() { Schema::create('synonyms', function ($table) { $table->increments('id'); $table->text('term'); // 展開対象の語 $table->text('synonym'); // 展開後の語 // 例:term: @, synonym: @ // 例:term: @, synonym: エラー制御演算子 // 「@」→「@ OR エラー制御演算子」 $table->timestamps(); // インデックス定義(後述) }); }
  • 66. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 マイグレーション インデックス $table->index( // termで完全一致できるようにする設定 [DB::raw( "term pgroonga_text_term_search_ops_v2")], null, "pgroonga");
  • 67. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 同義語登録 シーダー作成 % php artisan make:seeder SynonymsTableSeeder
  • 68. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 シーダー public function run() { $synonyms = [ // @そのもので検索させないならこれはいらない ["term" => "@", "synonym" => "@"], ["term" => "@", // synonymでは演算子を使える // ">": 重要度を上げる演算子 "synonym" => ">エラー制御演算子"], ]; DB::table("synonyms")->insert($synonyms); }
  • 69. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 動作確認 SELECT pgroonga_query_expand( 'synonyms', -- テーブル名 'term', -- 展開対象語のカラム名 'synonym', -- 展開後の語のカラム名 '@'); -- 展開対象のクエリー -- pgroonga_query_expand -- ------------------------------ -- ((@) OR (>エラー制御演算子)) -- (1 row)
  • 70. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 検索 whereRaw("title &@~ ? OR content &@~ ?", [">({$search_query})", $search_query]); // ↓クエリーをpgroonga_query_expand()で展開して利用 whereRaw( "title &@~ pgroonga_query_expand(?, ?, ?, ?) OR " . "content &@~ pgroonga_query_expand(?, ?, ?, ?)", ["synonyms", "term", "synonym", ">({$search_query})", "synonyms", "term", "synonym", $search_query]);
  • 71. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 同義語展開
  • 72. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 おさらい:基本機能 高速全文検索+ソート 検索キーワードハイライト キーワード周辺テキスト表示
  • 73. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 おさらい:高度な機能 オートコンプリート ローマ字対応(seiki→正規表現) 類似マニュアル検索 同義語展開 「@」→「@ OR エラー制御演算子」
  • 74. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 開発者募集! 公式検索システム置き換え!? 必要そう:複数バージョン対応 必要そう:複数言語対応 マニュアルをさらによく! 検索を便利に!→ユーザー増加! →フィードバックする人も増加!
  • 75. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 使いたい! WEICさんが運用予定! 2017年10月中にリリース予定 URL: http://phpdocs.weic.co.jp/ 宣伝(運用スポンサーの宣伝枠) PHPエンジニア大募集! 業務時間内にこれの開発もできる!?
  • 76. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHP document search情報 ソース https://github.com/kou/php-document- search OSS MITライセンス
  • 77. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 まとめ PostgreSQL + PGroonga 高速日本語全文検索サービスを PHPで簡単に作れる! 開発者募集! サービス提供予定 by WEIC! URL: http://phpdocs.weic.co.jp/
  • 78. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 MySQLでもできる? MySQL・PostgreSQLだけで作る 高速でリッチな 全文検索システム db tech showcase Tokyo 2017の資 料 PGroongaの代わりにMroongaを使う SQLでの書き方だけでPHPの話はない https://slide.rabbit-shocker.org/authors/kou/db-tech- showcase-tokyo-2017/
  • 79. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHP+MySQL+Mroonga入門 Groongaではじめる全文検索 https://grnbook-ja.tumblr.com/ 著者:北市真 PHP+Mroonga入門の電子書籍 今はまだ無料!
  • 80. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 PHPの開発へ参加! PHPの開発に参加しませんか? 例:PDO/LaravelのPostgreSQL関連 例:マニュアル生成まわり 例:PHP document search関連 やりたいけど自分はムリそう… そんなことはないんですよ!
  • 81. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 OSS Gate OSS Gate OSS開発者を増やす取り組み OSS Gateワークショップ OSS開発未経験者を経験者にする ワークショップ PHPもOSS!
  • 82. PostgreSQLとPGroongaで 作る PHPマニュアル 高速全文検索システム Powered by Rabbit 2.2.2 ワークショップ このカンファレンス内で開催! 午後にこの部屋で開催(2時間45分) 参加希望者は私に声をかけて! PHP関連のOSSの開発に 参加する人を増やそう! 今回だけで終わりにしないで 今回を始まりにしたい!