SlideShare a Scribd company logo
1 of 47
Download to read offline
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
PHPで
PostgreSQLと
PGroongaを使って
高速日本語全文検索!
須藤功平 クリアコード
第115回 PHP勉強会@東京
2017-06-28
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
PostgreSQLと全文検索
LIKE:組込機能
textsearch:組込機能
pg_trgm:標準添付
アーカイブには含まれている
別途インストールすれば使える
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
LIKE
少ないデータ
十分実用的
400文字×20万件くらいなら1秒とか
少なくないデータ
性能問題アリ
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
textsearch
インデックスを作るので速い
言語毎にモジュールが必要
英語やフランス語などは組込
日本語は別途必要
日本語用モジュール
公式にはメンテナンスされていない
forkして動くようにしている人はいる
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
pg_trgm
インデックスを作るので速い
注:ヒット件数が増えると遅い
注:テキスト量が多いと遅い
注:1,2文字の検索は遅い(米・日本)
日本語を使うにはひと工夫必要
C.UTF-8を使う
ソースを変更してビルド
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
プラグイン
pg_bigm
pg_trgmの日本語対応強化版
PGroonga
本気の全文検索エンジンを利用
速いし日本語もバッチリ!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
ベンチマーク: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
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
ベンチマーク: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
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
よし!
PostgreSQLとPGroongaを使って
高速日本語全文検索サービスを
PHPで作ろう!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
PHP document search
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
機能
検索キーワードハイライト
キーワード周辺テキスト表示
オートコンプリート
ローマ字対応(seiki→正規表現)
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
作り方:ツール
フレームワーク
Laravel
RDBMS
PostgreSQL
高速日本語全文検索機能
PGroonga
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
作り方:インストール
Laravel
省略
PostgreSQL
パッケージで
PGroonga
パッケージで
https://pgroonga.github.io/ja/install/
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
初期化:Laravel
% laravel new php-document-search
% cd php-document-search
% editor .env
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
初期化:データベース
% sudo -u postgres -H 
createdb php_document_search
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
初期化:PGroonga
-- ↓を実行する必要がある
CREATE EXTENSION pgroonga;
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
初期化:PGroonga
マイグレーションファイル作成
% php artisan 
make:migration enable_pgroonga
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
マイグレーション
public function up()
{
DB::statement("CREATE EXTENSION pgroonga;");
}
public function down()
{
DB::statement("DROP EXTENSION pgroonga;");
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
モデル作成
ドキュメントはモデル
名前:Entry
1ページ1インスタンス
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
モデル作成
% php artisan 
make:model 
--migration 
--controller 
--resource 
Entry
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
マイグレーション
public function up() {
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');
});
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
データ登録
PHPのドキュメントを
ローカルで生成
PHPのドキュメントの作り方
http://doc.php.net/tutorial/
フィードバックチャンスがいろい
ろあったよ!(後述)
1.
ページ毎にPostgreSQLに挿入2.
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
コマンド作成
% php artisan 
make:command 
--command=doc:register 
RegisterDocuments
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
登録コマンド実装(一部)
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();
}
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
登録
% php artisan doc:register
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
検索用コントローラー
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,
]);
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
検索対象モデル
public function
scopeFullTextSearch($query, $search_query)
{
if ($search_query) {
return ...; // クエリーがあったら検索
} else {
return ...; // なかったら適当に返す(省略)
}
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
検索対象モデル:検索
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');
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
キーワードハイライト
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]);
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
検索結果
<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>
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
検索対象モデル:配列
public function getContentSnippetsAttribute($value)
{ // PostgreSQLは配列をサポートしているがPDOは未サポート
// '["...","..."]'という文字列になるのでそれを配列に変換
return array_map(
function ($e) {
// 「"」が「"」になっているので戻す
return preg_replace('/(.)/', '$1', $e);
},
explode('","', substr($value, 2, -2)));
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
高速日本語全文検索!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
オートコンプリート
必要なもの
候補用テーブル
候補のヨミガナ(カタカナ)
PGroonga!!!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
モデル作成
% php artisan 
make:model 
--migration 
--controller 
--resource 
Term
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
マイグレーション:カラム
public function up()
{
Schema::create('terms', function ($table) {
$table->increments('id');
$table->text('term');
$table->text('label');
$table->text('reading'); // 本当は配列にしたい
$table->timestamps();
// インデックス定義(後述)
});
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
マイグレーション
インデックス
$table->index([
// 候補に対する前方一致検索用
DB::raw('term pgroonga.text_term_search_ops_v2'),
// ヨミガナに対する前方一致RK検索用
DB::raw('reading pgroonga.text_term_search_ops_v2'),
], null, 'pgroonga');
// 候補に対する全文検索用(中間一致用)
$table->index([DB::raw('term')], null, 'pgroonga');
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
前方一致RK検索
日本語特化の前方一致検索
ローマ字・ひらがな・カタカナで
カタカナを前方一致検索できる
gy→ギュウニュウ
ぎ→ギュウニュウ
ギ→ギュウニュウ
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
候補モデル:検索
public function
scopeComplete($query, $search_query)
{
return $query
->select("label")
->highlightHTML('label', $search_query)
->whereRaw("term &^ :query OR " . // 前方一致検索
"reading &^~ :query OR " . // 前方一致RK検索
"term @@ :query", // 全文検索
["query" => $search_query])
->orderBy("label")
->limit(10);
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
コントローラー
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);
}
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
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);
};
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
オートコンプリート!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
まとめ
PGroongaを使えば…
高速日本語全文検索サービスを…
PHPで簡単に作れる!
PHP document searchのソース
https://github.com/kou/php-document-
search
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
その他(1)
PHP+MySQL+Mroongaでも簡単!
Groongaではじめる全文検索
https://grnbook-ja.tumblr.com/
著者:北市真
PHP+Mroonga入門の電子書籍
今はまだ無料!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
その他(2)
だれかPHP document searchを
メンテナンスしませんか?
普通に便利じゃないかと!
複数バージョン対応とか
複数言語対応とか
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
その他(3)
PHPの開発に参加しませんか?
PDOのPostgreSQL対応強化とか
ドキュメントまわりとか
やりたいけど自分はムリそう…
そんなことはないんですよ!
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
その他(4)
OSS Gateワークショップ
OSS開発未経験者を経験者にする
ワークショップ
PHPもOSS!
次回は7月29日
https://oss-gate.doorkeeper.jp/events/
upcoming
PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1
その他(5)
PHPカンファレンス2017内で
OSS Gateワークショップ開催は
どうですか!?
PHP関連のOSSの開発に参加する人が
増えるとうれしい?
うれしいならコラボできそう

More Related Content

What's hot

MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報Kouhei Sutou
 
MroongaとPGroonga
MroongaとPGroongaMroongaとPGroonga
MroongaとPGroongaKouhei Sutou
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Kouhei Sutou
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Apache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでKouhei Sutou
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!Kouhei Sutou
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeToshi Harada
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料Hironobu Saitoh
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界Yoshinori Nakanishi
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLSatoshi Yamada
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Daisuke Kikuchi
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことMasahiko Sawada
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)Kosuke Kida
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
pg_bigmと類似度検索
pg_bigmと類似度検索pg_bigmと類似度検索
pg_bigmと類似度検索Masahiko Sawada
 

What's hot (20)

PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
Groonga族2015
Groonga族2015Groonga族2015
Groonga族2015
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報
 
MroongaとPGroonga
MroongaとPGroongaMroongaとPGroonga
MroongaとPGroonga
 
Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!Mroonga開発者が来たぞ!
Mroonga開発者が来たぞ!
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
Apache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject IntrospectionでApache ArrowのRubyバインディングをGObject Introspectionで
Apache ArrowのRubyバインディングをGObject Introspectionで
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!
 
Osc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatypeOsc2015 hokkaido postgresql-semi-stuructured-datatype
Osc2015 hokkaido postgresql-semi-stuructured-datatype
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQL
 
Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)Fluentd+elasticsearch+kibana(fluentd編)
Fluentd+elasticsearch+kibana(fluentd編)
 
pg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいことpg_bigmを触り始めた人に伝えたいこと
pg_bigmを触り始めた人に伝えたいこと
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
実践Realm
実践Realm実践Realm
実践Realm
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
pg_bigmと類似度検索
pg_bigmと類似度検索pg_bigmと類似度検索
pg_bigmと類似度検索
 

Viewers also liked

Laravel の学び方と得られる学び
Laravel の学び方と得られる学びLaravel の学び方と得られる学び
Laravel の学び方と得られる学びMasaru Matsuo
 
Laravelチュートリアルを作ってみた。
Laravelチュートリアルを作ってみた。Laravelチュートリアルを作ってみた。
Laravelチュートリアルを作ってみた。Futoshi Endo
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDockerMasashi Shinbara
 
アプリチームを支えるSlack bot
アプリチームを支えるSlack botアプリチームを支えるSlack bot
アプリチームを支えるSlack botKazuaki KURIU
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFumihiko Shiroyama
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築Masashi Shinbara
 
JavaScriptから利用するFirebase
JavaScriptから利用するFirebaseJavaScriptから利用するFirebase
JavaScriptから利用するFirebaseTakuji Shimokawa
 
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチKazuaki KURIU
 
20151205フルスクラッチcms作成のノウハウ With Laravel
20151205フルスクラッチcms作成のノウハウ With Laravel20151205フルスクラッチcms作成のノウハウ With Laravel
20151205フルスクラッチcms作成のノウハウ With LaravelTakumi Yoshida
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説Fumiya Sakai
 
わかってるフレームワーク Laravel
わかってるフレームワーク Laravelわかってるフレームワーク Laravel
わかってるフレームワーク LaravelMasashi Shinbara
 
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード + 現場エンジニアのコメント付き
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード  +  現場エンジニアのコメント付きデザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード  +  現場エンジニアのコメント付き
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード + 現場エンジニアのコメント付きMayumi Narisawa
 
デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3Fumiya Sakai
 
カスタムトランジションやジェスチャーを生かしたUIの実装ポイント
カスタムトランジションやジェスチャーを生かしたUIの実装ポイントカスタムトランジションやジェスチャーを生かしたUIの実装ポイント
カスタムトランジションやジェスチャーを生かしたUIの実装ポイントFumiya Sakai
 
Laravelを使ってみた
Laravelを使ってみたLaravelを使ってみた
Laravelを使ってみたJaeseop Jeong
 
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介Fumiya Sakai
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Yuuki Takezawa
 
Phpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろうPhpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろうSyouta Tada
 

Viewers also liked (20)

Laravel の学び方と得られる学び
Laravel の学び方と得られる学びLaravel の学び方と得られる学び
Laravel の学び方と得られる学び
 
Laravelチュートリアルを作ってみた。
Laravelチュートリアルを作ってみた。Laravelチュートリアルを作ってみた。
Laravelチュートリアルを作ってみた。
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDocker
 
アプリチームを支えるSlack bot
アプリチームを支えるSlack botアプリチームを支えるSlack bot
アプリチームを支えるSlack bot
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
 
JavaScriptから利用するFirebase
JavaScriptから利用するFirebaseJavaScriptから利用するFirebase
JavaScriptから利用するFirebase
 
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
 
20151205フルスクラッチcms作成のノウハウ With Laravel
20151205フルスクラッチcms作成のノウハウ With Laravel20151205フルスクラッチcms作成のノウハウ With Laravel
20151205フルスクラッチcms作成のノウハウ With Laravel
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
 
わかってるフレームワーク Laravel
わかってるフレームワーク Laravelわかってるフレームワーク Laravel
わかってるフレームワーク Laravel
 
Laravel LT
Laravel LTLaravel LT
Laravel LT
 
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード + 現場エンジニアのコメント付き
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード  +  現場エンジニアのコメント付きデザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード  +  現場エンジニアのコメント付き
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード + 現場エンジニアのコメント付き
 
3 tips of Laravel
3 tips of Laravel3 tips of Laravel
3 tips of Laravel
 
デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3デザインにもこだわったUiの事始め3
デザインにもこだわったUiの事始め3
 
カスタムトランジションやジェスチャーを生かしたUIの実装ポイント
カスタムトランジションやジェスチャーを生かしたUIの実装ポイントカスタムトランジションやジェスチャーを生かしたUIの実装ポイント
カスタムトランジションやジェスチャーを生かしたUIの実装ポイント
 
Laravelを使ってみた
Laravelを使ってみたLaravelを使ってみた
Laravelを使ってみた
 
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩
 
Phpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろうPhpフレームワーク 「laravel」でブログを作ろう
Phpフレームワーク 「laravel」でブログを作ろう
 

Similar to PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!

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
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)Rui Hirokawa
 
20090704rubyist九州
20090704rubyist九州20090704rubyist九州
20090704rubyist九州koki_h
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
仕事で使うちょっとしたコードを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
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_FdwKohei KaiGai
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話Masahito Zembutsu
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜Megagon Labs
 
aptのマニュアルをpo4a化した話
aptのマニュアルをpo4a化した話aptのマニュアルをpo4a化した話
aptのマニュアルをpo4a化した話Nozomu KURASAWA
 
関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側Gosuke Miyashita
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218Yoshi Sakai
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
 
Sohu邮箱的python经验
Sohu邮箱的python经验Sohu邮箱的python经验
Sohu邮箱的python经验Ryan Poy
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺Shogo Kawahara
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarSotaro Karasawa
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3ichikaway
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 

Similar to PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! (20)

RとWeb API
RとWeb APIRとWeb API
RとWeb API
 
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
 
最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)最新PHP事情 (2000年7月22日,PHPカンファレンス)
最新PHP事情 (2000年7月22日,PHPカンファレンス)
 
20090704rubyist九州
20090704rubyist九州20090704rubyist九州
20090704rubyist九州
 
Haikara
HaikaraHaikara
Haikara
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
仕事で使うちょっとしたコードを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
 
20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw20190314 PGStrom Arrow_Fdw
20190314 PGStrom Arrow_Fdw
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
 
aptのマニュアルをpo4a化した話
aptのマニュアルをpo4a化した話aptのマニュアルをpo4a化した話
aptのマニュアルをpo4a化した話
 
関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側関西オープンソース 2008 30days Albumの裏側
関西オープンソース 2008 30days Albumの裏側
 
Zabbix API
Zabbix APIZabbix API
Zabbix API
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
Sohu邮箱的python经验
Sohu邮箱的python经验Sohu邮箱的python经验
Sohu邮箱的python经验
 
PHPとJavaScriptの噺
PHPとJavaScriptの噺PHPとJavaScriptの噺
PHPとJavaScriptの噺
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 

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
 
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)

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
 
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
 
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

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Recently uploaded (9)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!

  • 1. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! 須藤功平 クリアコード 第115回 PHP勉強会@東京 2017-06-28
  • 2. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 PostgreSQLと全文検索 LIKE:組込機能 textsearch:組込機能 pg_trgm:標準添付 アーカイブには含まれている 別途インストールすれば使える
  • 3. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 LIKE 少ないデータ 十分実用的 400文字×20万件くらいなら1秒とか 少なくないデータ 性能問題アリ
  • 4. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 textsearch インデックスを作るので速い 言語毎にモジュールが必要 英語やフランス語などは組込 日本語は別途必要 日本語用モジュール 公式にはメンテナンスされていない forkして動くようにしている人はいる
  • 5. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 pg_trgm インデックスを作るので速い 注:ヒット件数が増えると遅い 注:テキスト量が多いと遅い 注:1,2文字の検索は遅い(米・日本) 日本語を使うにはひと工夫必要 C.UTF-8を使う ソースを変更してビルド
  • 6. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 プラグイン pg_bigm pg_trgmの日本語対応強化版 PGroonga 本気の全文検索エンジンを利用 速いし日本語もバッチリ!
  • 7. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 ベンチマーク: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
  • 8. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 ベンチマーク: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
  • 9. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 よし! PostgreSQLとPGroongaを使って 高速日本語全文検索サービスを PHPで作ろう!
  • 10. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 PHP document search
  • 11. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 機能 検索キーワードハイライト キーワード周辺テキスト表示 オートコンプリート ローマ字対応(seiki→正規表現)
  • 12. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 作り方:ツール フレームワーク Laravel RDBMS PostgreSQL 高速日本語全文検索機能 PGroonga
  • 13. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 作り方:インストール Laravel 省略 PostgreSQL パッケージで PGroonga パッケージで https://pgroonga.github.io/ja/install/
  • 14. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 初期化:Laravel % laravel new php-document-search % cd php-document-search % editor .env
  • 15. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 初期化:データベース % sudo -u postgres -H createdb php_document_search
  • 16. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 初期化:PGroonga -- ↓を実行する必要がある CREATE EXTENSION pgroonga;
  • 17. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 初期化:PGroonga マイグレーションファイル作成 % php artisan make:migration enable_pgroonga
  • 18. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 マイグレーション public function up() { DB::statement("CREATE EXTENSION pgroonga;"); } public function down() { DB::statement("DROP EXTENSION pgroonga;"); }
  • 19. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 モデル作成 ドキュメントはモデル 名前:Entry 1ページ1インスタンス
  • 20. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 モデル作成 % php artisan make:model --migration --controller --resource Entry
  • 21. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 マイグレーション public function up() { 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'); }); }
  • 22. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 データ登録 PHPのドキュメントを ローカルで生成 PHPのドキュメントの作り方 http://doc.php.net/tutorial/ フィードバックチャンスがいろい ろあったよ!(後述) 1. ページ毎にPostgreSQLに挿入2.
  • 23. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 コマンド作成 % php artisan make:command --command=doc:register RegisterDocuments
  • 24. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 登録コマンド実装(一部) 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(); } }
  • 25. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 登録 % php artisan doc:register
  • 26. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 検索用コントローラー 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, ]); }
  • 27. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 検索対象モデル public function scopeFullTextSearch($query, $search_query) { if ($search_query) { return ...; // クエリーがあったら検索 } else { return ...; // なかったら適当に返す(省略) } }
  • 28. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 検索対象モデル:検索 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');
  • 29. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 キーワードハイライト 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]); }
  • 30. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 検索結果 <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>
  • 31. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 検索対象モデル:配列 public function getContentSnippetsAttribute($value) { // PostgreSQLは配列をサポートしているがPDOは未サポート // '["...","..."]'という文字列になるのでそれを配列に変換 return array_map( function ($e) { // 「"」が「"」になっているので戻す return preg_replace('/(.)/', '$1', $e); }, explode('","', substr($value, 2, -2))); }
  • 32. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 高速日本語全文検索!
  • 33. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 オートコンプリート 必要なもの 候補用テーブル 候補のヨミガナ(カタカナ) PGroonga!!!
  • 34. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 モデル作成 % php artisan make:model --migration --controller --resource Term
  • 35. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 マイグレーション:カラム public function up() { Schema::create('terms', function ($table) { $table->increments('id'); $table->text('term'); $table->text('label'); $table->text('reading'); // 本当は配列にしたい $table->timestamps(); // インデックス定義(後述) }); }
  • 36. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 マイグレーション インデックス $table->index([ // 候補に対する前方一致検索用 DB::raw('term pgroonga.text_term_search_ops_v2'), // ヨミガナに対する前方一致RK検索用 DB::raw('reading pgroonga.text_term_search_ops_v2'), ], null, 'pgroonga'); // 候補に対する全文検索用(中間一致用) $table->index([DB::raw('term')], null, 'pgroonga');
  • 37. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 前方一致RK検索 日本語特化の前方一致検索 ローマ字・ひらがな・カタカナで カタカナを前方一致検索できる gy→ギュウニュウ ぎ→ギュウニュウ ギ→ギュウニュウ
  • 38. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 候補モデル:検索 public function scopeComplete($query, $search_query) { return $query ->select("label") ->highlightHTML('label', $search_query) ->whereRaw("term &^ :query OR " . // 前方一致検索 "reading &^~ :query OR " . // 前方一致RK検索 "term @@ :query", // 全文検索 ["query" => $search_query]) ->orderBy("label") ->limit(10); }
  • 39. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 コントローラー 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); }
  • 40. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 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); };
  • 41. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 オートコンプリート!
  • 42. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 まとめ PGroongaを使えば… 高速日本語全文検索サービスを… PHPで簡単に作れる! PHP document searchのソース https://github.com/kou/php-document- search
  • 43. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 その他(1) PHP+MySQL+Mroongaでも簡単! Groongaではじめる全文検索 https://grnbook-ja.tumblr.com/ 著者:北市真 PHP+Mroonga入門の電子書籍 今はまだ無料!
  • 44. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 その他(2) だれかPHP document searchを メンテナンスしませんか? 普通に便利じゃないかと! 複数バージョン対応とか 複数言語対応とか
  • 45. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 その他(3) PHPの開発に参加しませんか? PDOのPostgreSQL対応強化とか ドキュメントまわりとか やりたいけど自分はムリそう… そんなことはないんですよ!
  • 46. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 その他(4) OSS Gateワークショップ OSS開発未経験者を経験者にする ワークショップ PHPもOSS! 次回は7月29日 https://oss-gate.doorkeeper.jp/events/ upcoming
  • 47. PHPで PostgreSQLと PGroongaを使って 高速日本語全文検索! Powered by Rabbit 2.2.1 その他(5) PHPカンファレンス2017内で OSS Gateワークショップ開催は どうですか!? PHP関連のOSSの開発に参加する人が 増えるとうれしい? うれしいならコラボできそう