SlideShare a Scribd company logo
1 of 97
Download to read offline
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
MySQL・PostgreSQLだけで作る
高速あいまい全文検索システム
須藤功平 株式会社クリアコード
db tech showcase Tokyo 2018
2018-09-20
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
全文検索システム
大量の文書から
指定されたキーワードを使って
高速に必要な文書を
見つけるシステム
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
dbts2017
MySQL・PostgreSQLだけで作る 高速でリッチな全文検索システム Powered by Rabbit 2.2.1
MySQL・PostgreSQLだけで作る
高速でリッチな全文検索システム
須藤功平 株式会社クリアコード
db tech showcase Tokyo 2017
2017-09-07
https://slide.rabbit-shocker.org/authors/kou/db-tech-showcase-tokyo-2017/
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
リッチな全文検索システム
キーワードハイライト
周辺テキスト表示
入力補完・同義語展開
関連文書の表示
構造化データ対応(例:オフィス文書)
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
もっとリッチな全文検索システム
大量の文書から
あいまいな情報を使って
高速に必要な文書を
見つけるシステム
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまいな情報
相手が人だから
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
人
文書内の表記が揺れる
例:「焼き肉」「焼きにく」
検索対象
提供情報が間違っている
例:「テノクロジー」
検索クエリー
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
もっとリッチな全文検索システム
大量の文書から
あいまいな情報を使って
高速に必要な文書を
見つけるシステム
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ツール
全文検索エンジン
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
普通の全文検索エンジン
高速検索
あいまい検索
独自の使い方
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
開発しやすいシステム
SQLで使える
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
使いやすい全文検索エンジン
高速検索
あいまい検索
SQLで使える
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
SQLで使える全文検索エンジン
Mroonga
MySQL・MariaDB用
http://mroonga.org/ja/docs/install.html
PGroonga
PostgreSQL用
https://pgroonga.github.io/ja/install/
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ1
焼肉:全部漢字
焼き肉:送り仮名
焼きにく:まぜまぜ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ1対策
ヨミガナ検索
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索
ヨミガナで検索
「焼肉」→「ヤキニク」
「焼きにく」→「ヤキニク」
どちらも同じになる
人名(高と髙とか)にも使える
ヨミガナ情報の取得が必要
MeCabで自動化可能
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
MeCabでヨミガナ化
% echo 焼肉と焼きにく | mecab | cut -d, -f8
ヤキニク
ト
ヤキニク
EOS
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:Mroonga:テーブル定義
CREATE TABLE menus (
name varchar(255), -- 検索対象
FULLTEXT INDEX (name) -- ヨミガナ検索対応インデックス
COMMENT
'tokenizer "TokenMecab('use_reading', true)"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:Mroonga:データ例
INSERT INTO menus
VALUES ('焼肉定食'),
('焼きにく定食');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:Mroonga:検索
SELECT name FROM menus
WHERE MATCH (name)
AGAINST ('*D+ 焼きにく' IN BOOLEAN MODE);
-- 焼肉定食
-- 焼きにく定食
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:PGroonga:テーブル定義
CREATE TABLE menus (
name text -- 検索対象
);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:PGroonga:インデックス定義
CREATE INDEX menus_search ON menus
USING PGroonga (name)
WITH (tokenizer='TokenMecab("use_reading", true)');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:PGroonga:データ例
INSERT INTO menus
VALUES ('焼肉定食'),
('焼きにく定食');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ヨミガナ検索:PGroonga:検索
SELECT name FROM menus
WHERE name &@~ '焼きにく';
-- 焼肉定食
-- 焼きにく定食
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ2
「ぼたん鍋」
と
「猪鍋」
(別名)
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ2対策
同義語展開
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開
実行前にクエリーを変換
「ぼたん鍋」→「ぼたん鍋 OR 猪鍋」
どちらもヒット
変換ルールは事前に用意
ある程度自動生成可能
例:NEologdやWikipediaを利用
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroonga:テーブル定義
CREATE TABLE synonyms (
term varchar(255), -- 展開対象の語
synonym varchar(255), -- 同義語
INDEX (term) -- 高速化と精度向上
COMMENT 'normalizer "NormalizerNFKC100"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroonga:データ例
INSERT INTO synonyms
-- 「ぼたん鍋」を「ぼたん鍋 OR 猪鍋」に展開
VALUES ('ぼたん鍋', 'ぼたん鍋'),
('ぼたん鍋', '猪鍋'),
-- 「猪鍋」を「猪鍋 OR ぼたん鍋」に展開
('猪鍋', '猪鍋'),
('猪鍋', 'ぼたん鍋');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroonga:確認方法
SELECT mroonga_query_expand(
'synonyms', -- テーブル名
'term', -- 展開対象のカラム名
'synonym', -- 対応する同義語のカラム名
'ランチ ぼたん鍋' -- クエリー
);
-- 'ランチ ((ぼたん鍋) OR (猪鍋))'
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroonga:検索方法
SELECT title FROM entries
WHERE
MATCH (title)
-- '*D+ ランチ OR ((ぼたん鍋) OR (猪鍋))'になる
AGAINST (mroonga_query_expand('synonyms',
'term',
'synonym',
'*D+ ランチ ぼたん鍋')
IN BOOLEAN MODE);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:PGroonga:テーブル定義
CREATE TABLE synonyms (
-- 展開対象の語
term text,
-- 同義語のリスト
-- term自身も含める
-- 含めない場合はtermが検索禁止語になる
terms text[]
);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:PGroonga:データ例
INSERT INTO synonyms
VALUES ('ぼたん鍋', -- 「ぼたん鍋」を展開
ARRAY['ぼたん鍋', '猪鍋']),
('猪鍋', -- 「猪鍋」を展開
ARRAY['猪鍋', 'ぼたん鍋']);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:PGroonga:インデックス定義
CREATE INDEX synonym_search ON synonyms
USING PGroonga
-- ...text_term_search...
-- termで完全一致検索をするため
(term pgroonga_text_term_search_ops_v2);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:PGroonga:確認方法
SELECT pgroonga_query_expand(
'synonyms', -- テーブル名
'term', -- 展開対象のカラム名
'terms', -- 対応する同義語配列のカラム名
'ランチ ぼたん鍋' -- クエリー
);
-- 'ランチ ((ぼたん鍋) OR (猪鍋))'
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
同義語展開:PGroonga:検索方法
SELECT title FROM entries
WHERE
-- title &@~ ランチ ((ぼたん鍋) OR (猪鍋))'になる
title &@~
pgroonga_query_expand('synonyms',
'term',
'terms',
'ランチ ぼたん鍋');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ3
090-1234-5678:ハイフン入り
(090)1234-5678:カッコとハイフン入り
09012345678:区切りなし
090 1234 5678:空白区切り
(090)1234ー5678:全角文字入り
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ3対策
電話番号検索
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索
文字を正規化
全角→半角
ハイフンっぽい文字→ハイフン
長音っぽい文字→ハイフン
記号・空白を無視して検索
元クエリー:(090)1234 5678
実クエリー:09012345678
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:Mroonga:テーブル定義
CREATE TABLE people (
tel varchar(255), -- 検索対象
FULLTEXT INDEX (tel) COMMENT
-- 電話番号検索対応インデックス
'normalizer "NormalizerNFKC100(
'unify_hyphen_and_prolonged_sound_mark', true)",
tokenizer "TokenNgram('loose_symbol', true,
'loose_blank', true)"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:Mroonga:データ例
INSERT INTO people
VALUES ('090-1234-5678'),
('(090)1234-5678'),
('09012345678'),
('090 1234 5678'),
('(090)1234ー5678');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:Mroonga:検索
SELECT tel FROM people
WHERE MATCH (tel)
AGAINST ('*D+ 090ー12345678' IN BOOLEAN MODE);
-- 090-1234-5678
-- (090)1234-5678
-- 09012345678
-- 090 1234 5678
-- (090)1234ー5678
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:PGroonga:テーブル定義
CREATE TABLE people (
tel text -- 検索対象
);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:PGroonga:インデックス定義
CREATE INDEX people_search ON people
USING PGroonga (tel)
WITH (normalizer='
NormalizerNFKC100("unify_hyphen_and_prolonged_sound_mark", true)',
tokenizer='TokenNgram("loose_symbol", true,
"loose_blank", true)');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:PGroonga:データ例
INSERT INTO people
VALUES ('090-1234-5678'),
('(090)1234-5678'),
('09012345678'),
('090 1234 5678'),
('(090)1234ー5678');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
電話番号検索:PGroonga:検索
SELECT tel FROM people
WHERE tel &@~ '090ー12345678';
-- 090-1234-5678
-- (090)1234-5678
-- 09012345678
-- 090 1234 5678
-- (090)1234ー5678
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ4
sèvre-et-maine
セーヴェル エ メーヌ
「ーヴェ」・空白区切り
セブルエメーヌ
「ブ」・区切りなし
セーブル・エ・メーヌ
「ーブ」・中点区切り
セーヴル エメーヌ
「ーヴ」・片方だけ空白区切り
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:表記ゆれ4対策
ワイン名検索
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索
文字を正規化
ヴ・ヴェ→ブ
ハイフン・長音っぽい文字→ハイフン
中点っぽい文字→中点
記号・空白を無視して検索
元クエリー:セーヴェル・エメーヌ
実クエリー:セブルエメヌ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:Mroonga:テーブル定義
CREATE TABLE wines (
name varchar(255), -- 検索対象
FULLTEXT INDEX (name) COMMENT
-- ワイン名検索対応インデックス
'normalizer "NormalizerNFKC100(
'unify_katakana_bu_sound', true,
'unify_hyphen_and_prolonged_sound_mark', true,
'unify_middle_dot', true)",
tokenizer "TokenNgram('loose_symbol', true,
'loose_blank', true)"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:Mroonga:データ例
INSERT INTO wines
VALUES ('セーヴェル エ メーヌ'),
('セブルエメーヌ'),
('セーブル・エ・メーヌ'),
('セーヴル エメーヌ');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:Mroonga:検索
SELECT name FROM wines
WHERE MATCH (name)
AGAINST ('*D+ セーヴェルエメーヌ' IN BOOLEAN MODE);
-- セーヴェル エ メーヌ
-- セブルエメーヌ
-- セーブル・エ・メーヌ
-- セーヴル エメーヌ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:PGroonga:テーブル定義
CREATE TABLE wines (
name text -- 検索対象
);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:PGroonga:インデックス定義
CREATE INDEX wines_search ON wines
USING PGroonga (name)
WITH (normalizer='NormalizerNFKC100(
"unify_katakana_bu_sound", true,
"unify_hyphen_and_prolonged_sound_mark", true,
"unify_middle_dot", true)',
tokenizer='TokenNgram("loose_symbol", true,
"loose_blank", true)');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:PGroonga:データ例
INSERT INTO wines
VALUES ('セーヴェル エ メーヌ'),
('セブルエメーヌ'),
('セーブル・エ・メーヌ'),
('セーヴル エメーヌ');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
ワイン名検索:PGroonga:検索
SELECT name FROM wines
WHERE name &@~ 'セーヴェルエメーヌ';
-- セーヴェル エ メーヌ
-- セブルエメーヌ
-- セーブル・エ・メーヌ
-- セーヴル エメーヌ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
表記ゆれ:まとめ
ヨミガナ検索
漢字・送り仮名の違いを吸収
同義語展開:別名をカバー
電話番号検索
半角全角・記号の有無・記号の違いを吸収
ワイン名検索
外来語のカタカナ表記の違いを吸収
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
表記ゆれ:参考情報
文字の正規化方法
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:かなの同一視
unify_kana
ひらがなとカタカナを区別しない
↓は同じ
あいうえお
アイウエオ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:濁点の同一視
unify_sound_mark
濁点・半濁点の有無を区別しない
↓は同じ
はひふへほ
ばびぶべぼ
ぱぴぷぺぽ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:大文字・小文字の同一視
unify_kana_case
大文字・小文字を区別しない
↓は同じ
やゆよ
ゃゅょ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:ハイフンっぽい文字の同一視
unify_hyphen
ハイフンっぽい文字をハイフンへ
ハイフン:U+002D
ハイフンっぽい文字:
-˗֊‐‑‒–⁃⁻₋−
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:長音記号っぽい文字の同一視
unify_prolonged_sound_mark
長音記号っぽい文字を長音記号へ
長音記号:U+30FC
長音記号っぽい文字:
ー—―─━ー
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:ハイフン・長音記号っぽい文字
unify_hyphen_and_prolonged_sound_mark
ハイフン・長音記号っぽい文字を
ハイフン(U+002D)へ
ハイフンっぽい文字:
-˗֊‐‑‒–⁃⁻₋−
長音記号っぽい文字:
ー—―─━ー
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:中点っぽい文字の同一視
unify_middle_dot
中点っぽい文字を中点へ
中点:U+00B7
中点っぽい文字
·ᐧ•∙⋅⸱・・
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:ヴァ→バ
unify_katakana_v_sounds
ヴァ行をバ行へ
↓は同じ
ヴァヴィヴヴェヴォ
バビブベボ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:ヴァ行→ブ
unify_katakana_bu_sound
ヴァ行をブへ
↓は同じ
ヴァヴィヴヴェヴォ
ブブブブブ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:MySQL 8.0
日本語用COLLATIONを追加
utf8mb4_ja_0900_as_cs
COLLATION:文字の順序のルール
順序なので等価比較機能もある
最新Mroongaは対応済み
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
正規化:PostgreSQL 10
ICUベースのCOLLATION対応
ICU:Unicode処理ライブラリー
COLLATION:文字の順序のルール
順序なので等価比較機能もある
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:typo
テノクロジー
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
あいまい検索:typo対策
fuzzy検索
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索
似ている文字列を検索
似ている=編集距離が小さい
インデックスを使って検索
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
編集距離
Aを何回編集するとBになるか
編集:
挿入・削除・置換
置換を禁止するケースもある
編集回数が距離
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
編集距離例:置換あり
A:テノクロジー
置換:ク↔ノ
B:テクノロジー
編集距離:1
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
編集距離例:置換なし
A:テノクロジー
削除:ク:テノロジー
挿入:ノ:テクノロジー
B:テクノロジー
編集距離:2
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:Mroonga:テーブル定義
CREATE TABLE tags (
name varchar(255), -- 検索対象
FULLTEXT INDEX (name) -- fuzzy検索対応インデックス
COMMENT 'tokenizer "none"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:Mroonga:データ例
INSERT INTO tags
VALUES ('テクノロジー'),
('テクニカル');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:Mroonga:検索
SELECT name,
MATCH(name) AGAINST(...↓と同じ内容...) AS score
FROM tags
WHERE MATCH (name)
AGAINST (CONCAT('*SS fuzzy_search(name, ',
mroonga_escape('テノクロジー' AS script),
', ',
'{"with_transposition": true,
"max_distance": 4})')
IN BOOLEAN MODE);
-- テクノロジー | 4
-- テクニカル | 1
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:PGroonga:テーブル定義
CREATE TABLE tags (
name text -- 検索対象
);
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:PGroonga:インデックス定義
CREATE INDEX tags_search ON tags
USING PGroonga (name)
WITH (tokenizer='');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:PGroonga:データ例
INSERT INTO tags
VALUES ('テクノロジー'),
('テクニカル');
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
fuzzy検索:PGroonga:検索
SELECT name, pgroonga_score(tableoid, ctid)
FROM tags
WHERE name &`
('fuzzy_search(name, ' ||
pgroonga_escape('テノクロジー') || ',
{"with_transposition": true,
"max_distance": 4})');
-- テクノロジー | 4
-- テクニカル | 1
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:あいまいな情報
人が用意した情報はあいまい
クエリーも検索対象も
あいまいでも必要な文書を見つける
人よりも機械ががんばる
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:あいまいな検索
全文検索エンジンを活用して実現
あいまい検索機能を提供しているはず
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:全文検索エンジン
普通の全文検索エンジン
独自の使い方
Mroonga・PGroonga
SQLで使える→開発しやすい
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:ヨミガナ検索
漢字・送り仮名の違いを吸収
焼肉・焼き肉・焼きにく
高橋・髙橋
MeCabで自動化できる
辞書により失敗することはある
同義語には対応できない
同義語展開と併用
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:同義語展開
別名に対応:「ぼたん鍋」と「猪鍋」
なにを同義語とするかが難しい
システム依存度が高い
ある程度は自動化できる
手動でのメンテナンスも必要
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:電話番号検索
半角全角・記号有無・記号違いを吸収
注意
どんな検索対象でもゆるくてよいわけではない
誤ヒットも増えてしまう
電話番号ならここまでゆるくてもOKというだけ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:ワイン名検索
外来語のカタカナ表記の違いを吸収
注意
どんな検索対象でもゆるくてよいわけではない
誤ヒットも増えてしまう
ワイン名ならここまでゆるくてもOKというだけ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
まとめ:fuzzy検索
typoしても本来のキーワードを推測
活用方法:
ヒットしなかったときの「もしかして」の実装
入力補完候補
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
参考情報:リッチな全文検索システム
MySQL・PostgreSQLだけで作る 高速でリッチな全文検索システム Powered by Rabbit 2.2.1
MySQL・PostgreSQLだけで作る
高速でリッチな全文検索システム
須藤功平 株式会社クリアコード
db tech showcase Tokyo 2017
2017-09-07
https://slide.rabbit-shocker.org/authors/kou/db-tech-showcase-tokyo-2017/
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
扱わなかったあいまい検索1
近傍検索
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
近傍検索
指定したキーワード間に
違う単語が含まれていてもマッチ
「みそラーメン」で検索:
「みそバターラーメン」:マッチ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
扱わなかったあいまい検索2
quorumマッチ
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
quorumマッチ
閾値以上の要素がマッチしたらマッチ
閾値2と
「MySQL MariaDB Percona」で検索:
「MySQLとMariaDBの比較」:マッチ
「MySQLとPostgreSQLの比較」:マッチしない
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
扱わなかった話題
運用について
障害対策・レプリケーション
チューニング
MySQL・PostgreSQLだけで作る 高速あいまい全文検索システム Powered by Rabbit 2.2.2
サポートサービス紹介
導入支援(設計支援・性能検証・移行支援・…)
開発支援(サンプルコード提供・問い合わせ対応・…)
運用支援(障害対応・チューニング支援・…)
問い合わせ先:
https://www.clear-code.com/contact/?type=groonga

More Related Content

What's hot

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
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
 
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)NTT DATA Technology & Innovation
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
PostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうkasaharatt
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタSatoyuki Tsukano
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!kwatch
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話Yuta Shimada
 
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 

What's hot (20)

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
 
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
PostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろう
 
はじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタはじめてのElasticsearchクラスタ
はじめてのElasticsearchクラスタ
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 

Similar to MySQL・PostgreSQLだけで作る高速あいまい全文検索システム

MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムKouhei Sutou
 
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
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版Kouhei Sutou
 
Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Kouhei Sutou
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーKouhei Sutou
 
初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報Kouhei Sutou
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!Kouhei Sutou
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!Kouhei Sutou
 
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムPostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムKouhei Sutou
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会Satoshi Nagayasu
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generatorOda Shinsuke
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料dcubeio
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナーTakahiro Iwase
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールElasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールShinsuke Sugaya
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べMasahiro Nagano
 

Similar to MySQL・PostgreSQLだけで作る高速あいまい全文検索システム (20)

MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システムMySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
MySQL・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を使いたいですよね!?
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版
 
Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法Mroonga・PGroonga導入方法
Mroonga・PGroonga導入方法
 
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナーMySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
MySQL・PostgreSQL上で動かす全文検索エンジン「Groonga」セミナー
 
初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報初心者向けMroonga・PGroonga情報
初心者向けMroonga・PGroonga情報
 
いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!いろいろ考えると日本語の全文検索もMySQLがいいね!
いろいろ考えると日本語の全文検索もMySQLがいいね!
 
PGroongaの実装
PGroongaの実装PGroongaの実装
PGroongaの実装
 
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 PHPでPostgreSQLとPGroongaを使って高速日本語全文検索! PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
 
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システムPostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
PostgreSQLとPGroongaで作るPHPマニュアル高速全文検索システム
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
20170329 D3 DBAが夜間メンテをしなくなった日 発表資料
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールElasticsearch Authプラグインでアクセスコントロール
Elasticsearch Authプラグインでアクセスコントロール
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
 

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

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
 
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をさらに活用!
 

MySQL・PostgreSQLだけで作る高速あいまい全文検索システム