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

イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークke-m kamekoopa
 
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...NTT DATA Technology & Innovation
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
TransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by TransformerTransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by TransformerYasutomo Kawanishi
 
簡易版AutoML+OptunaによるHyperparams Tuning
簡易版AutoML+OptunaによるHyperparams Tuning簡易版AutoML+OptunaによるHyperparams Tuning
簡易版AutoML+OptunaによるHyperparams TuningMasaharu Kinoshita
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)NTT DATA Technology & Innovation
 
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015Yahoo!デベロッパーネットワーク
 
20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについて20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについてPreferred Networks
 
[PyConJP2019]Pythonで切り開く新しい農業
[PyConJP2019]Pythonで切り開く新しい農業[PyConJP2019]Pythonで切り開く新しい農業
[PyConJP2019]Pythonで切り開く新しい農業Makoto Koike
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングKosuke Kida
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜Takahiro Inoue
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Preferred Networks
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料) 40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料) hamaken
 

What's hot (20)

イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
SQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォークSQLアンチパターン - ジェイウォーク
SQLアンチパターン - ジェイウォーク
 
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
TransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by TransformerTransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by Transformer
 
簡易版AutoML+OptunaによるHyperparams Tuning
簡易版AutoML+OptunaによるHyperparams Tuning簡易版AutoML+OptunaによるHyperparams Tuning
簡易版AutoML+OptunaによるHyperparams Tuning
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
 
pg_bigmを用いた全文検索のしくみ(後編)
pg_bigmを用いた全文検索のしくみ(後編)pg_bigmを用いた全文検索のしくみ(後編)
pg_bigmを用いた全文検索のしくみ(後編)
 
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
 
20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについて20171128分散深層学習とChainerMNについて
20171128分散深層学習とChainerMNについて
 
[PyConJP2019]Pythonで切り開く新しい農業
[PyConJP2019]Pythonで切り開く新しい農業[PyConJP2019]Pythonで切り開く新しい農業
[PyConJP2019]Pythonで切り開く新しい農業
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料) 40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 

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
 
初心者向け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
 
社内向け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導入方法
 
初心者向け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アプリケーション
 
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

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
 
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
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!Kouhei Sutou
 
株式会社クリアコード
株式会社クリアコード株式会社クリアコード
株式会社クリアコードKouhei Sutou
 

More from Kouhei Sutou (20)

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 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
 
全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!全文検索でRedmineをさらに活用!
全文検索でRedmineをさらに活用!
 
株式会社クリアコード
株式会社クリアコード株式会社クリアコード
株式会社クリアコード
 

Recently uploaded

情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 

Recently uploaded (12)

情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 

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の開発に 参加する人を増やそう! 今回だけで終わりにしないで 今回を始まりにしたい!