Rabbit Slide Show

PGroongaを使って全文検索結果をより良くする方法

2021-11-12

Description

PostgreSQL で使用できる全文検索の拡張に PGroonga という高速に全文検索できる拡張があります。 PGroongaはバックエンドに本格的な全文検索エンジンGroongaを使っており、高速な全文検索以外にも、 より良い検索結果を出すための機能(検索結果の適合率や再現率の向上や、より良い結果順にするためのスコアリング) が盛り込まれています。 PGroongaはPostgreSQLの拡張なので、SQLベースでこれらの機能を使うことができ、 SQLを使い慣れている人であれば、比較的スムーズにこれらの機能を使えます。 本発表では、全文検索結果をより良くするPGroongaの機能について、どのような機能があり、 それらをどう使うのかについて網羅的に紹介します。

Text

Page: 1

PGroongaを使って
全文検索結果を
より良くする方法
堀本 泰弘 株式会社クリアコード
PostgreSQL Conference Japan 2021
2021-11-12
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 2

自己紹介
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 3

今日のテーマ
検索結果の改善
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 4

目次
1. 検索結果の評価指標
2. PGrooongaで検索結果の改善
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 5

検索結果の評価指標
よく検索結果が
いまいちだ...
という話を
聞きます
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 6

検索結果の評価指標
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 7

いまいちな検索結果
😞検索漏れ
😞ノイズが多い
😞有用な情報を探し出せない
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 8

検索結果の評価指標
1. 適合率
2. 再現率
3. ランキング
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 9

適合率
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 10

再現率
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 11

適合率と再現率
具体例
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 12

適合率と再現率
Wikipediaで
"キログラムの
定義"を調べる
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 13

適合率と再現率
SELECT title FROM wikipedia where text &@~ 'キログラム 定義';
title
--------------------------------------------------------
水
力
国際単位系
.
.
.
キログラム
.
.
.
(229 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 14

適合率と再現率
適合率
2/229=0.87%
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 15

適合率と再現率
ヒットしなかったけど
欲しかった記事
SI基本単位の再定義
国際キログラム原器
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 16

適合率と再現率
再現率
2/4=50.0%
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 17

適合率と再現率の重要度
Web検索
適合率 > 再現率
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 18

適合率と再現率の重要度
特許検索
適合率 < 再現率
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 19

ランキング
検索結果の順序
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 20

ランキング
ユーザーは
上位数件
しか見ない
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 21

ランキングの指標(参考)
Precision@n
Map(Mean Average Precision)
nDCG(Normalizerd
Discounted Cumulative Gain)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 22

PGroongaで検索結果の改善
PGroongaで適合率/再現率改善
ノーマライザーを使う
トークナイザーを使う
ステミングを使う
fuzzy検索を使う
同義語展開を使う
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 23

PGroongaで検索結果の改善
PGroongaでランキング改善
スコアラーを使う
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 24

ノーマライズ
ノーマライズ
(正規化)とは?
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 25

ノーマライズ
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 26

ノーマライズ
例) カタカナをひらがなに正規化
きろぐらむ -> きろぐらむ
キログラム -> きろぐらむ
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 27

PGroongaのノーマライザー
(デフォルト)
CREATE TABLE normalizer_test (
id integer,
content text
);
CREATE INDEX pgroonga_content_index ON normalizer_test USING pgroonga (content);
INSERT INTO normalizer_test VALUES (1, 'キログラム');
INSERT INTO normalizer_test VALUES (2, 'きろぐらむ');
INSERT INTO normalizer_test VALUES (3, '㌕');
INSERT INTO normalizer_test VALUES (4, 'キログラム');
INSERT INTO normalizer_test VALUES (5, 'kiroguramu');
INSERT INTO normalizer_test VALUES (6, 'kiroguramu');
SELECT * FROM normalizer_test WHERE content &@ 'kiroguramu';
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 28

PGroongaのノーマライザー
(デフォルト)
SELECT * FROM normalizer_test WHERE content &@ 'kiroguramu';
id |
content
----+----------------------
5 | kiroguramu
6 | kiroguramu
(2 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 29

PGroongaのノーマライザー
(デフォルト)
kiroguramu
↓
kiroguramu
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 30

PGroongaのノーマライザー
(デフォルト)
NFKCを使った正規化
テキストエンコードがUTF-8の場合
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 31

PostgreSQLのノーマライザー
(デフォルト)
SELECT * FROM normalizer_test
WHERE content = (SELECT normalize('kiroguramu', NFKC));
id | content
----+------------
5 | kiroguramu
(1 row)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 32

ノーマライザーの変更
適合率/再現率を
上げたい
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 33

PGroongaのノーマライザー
(NormalizerNFKC130)
DROP INDEX pgroonga_content_index;
CREATE INDEX pgroonga_content_index
ON normalizer_test
USING pgroonga (content)
WITH (normalizers='NormalizerNFKC130("unify_to_romaji", true)');
SELECT * FROM normalizer_test WHERE content &@ 'kiroguramu';
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 34

PGroongaのノーマライザー
(NormalizerNFKC130)
SELECT * FROM normalizer_test WHERE content &@ 'kiroguramu';
id |
content
----+----------------------
1 | キログラム
2 | きろぐらむ
3 | ㌕
4 | キログラム
5 | kiroguramu
6 | kiroguramu
(6 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 35

PGroongaのノーマライザー
(NormalizerNFKC130)
unify_to_romaji
ローマ字に正規化
ローマ字で読んだときに同じ語は同一
視する
(e.g. 「kiroguramu」と「きろぐら
む」を同一視。ローマ字読みが同じだ
から)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 36

オプションの指定方法
CREATE INDEX pgroonga_content_index
ON normalizer_test
USING pgroonga (content)
WITH (normalizers='NormalizerNFKC130("unify_to_romaji", true)');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 37

複数オプションの指定方法
CREATE INDEX pgroonga_content_index
ON normalizer_test
USING pgroonga (content)
WITH (normalizers='NormalizerNFKC130("unify_to_romaji", true,
"unify_hyphen", true)');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 38

指定可能オプション一覧
NormalizerNFKC130の
オプション一覧
https://groonga.org/ja/docs/
reference/normalizers/
normalizer_nfkc130.html#syntax
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 39

トークナイズ
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 40

PGroongaのトークナイザー
(デフォルト)
CREATE TABLE tokenizer_test (
title text
);
CREATE INDEX pgroonga_content_index ON tokenizer_test USING pgroonga (title);
INSERT INTO tokenizer_test VALUES ('京都府 1日目 金閣寺');
INSERT INTO tokenizer_test VALUES ('京都府 2日目 嵐山');
INSERT INTO tokenizer_test VALUES ('京都府 3日目 天橋立');
INSERT INTO tokenizer_test VALUES ('東京都 1日目 スカイツリー');
INSERT INTO tokenizer_test VALUES ('東京都 2日目 浅草寺');
INSERT INTO tokenizer_test VALUES ('北海道 1日目 函館');
INSERT INTO tokenizer_test VALUES ('北海道 2日目 トマム');
INSERT INTO tokenizer_test VALUES ('北海道 3日目 富良野');
INSERT INTO tokenizer_test VALUES ('北海道 4日目 美瑛');
INSERT INTO tokenizer_test VALUES ('北海道 5日目 旭川');
SELECT * FROM tokenizer_test WHERE title &@~ '京都';
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 41

PGroongaのトークナイザー
(デフォルト)
SELECT * FROM tokenizer_test WHERE title &@~ '京都';
title
--------------------------------------
京都府 1日目 金閣寺
京都府 2日目 嵐山
京都府 3日目 天橋立
東京都 1日目 スカイツリー
東京都 2日目 浅草寺
(5 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 42

トークナイザーの変更
適合率を上げたい
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 43

PGroongaのトークナイザー
(TokenMecab)
CREATE INDEX pgroonga_content_index
ON tokenizer_test
USING pgroonga (title)
WITH (tokenizer='TokenMecab');
SELECT * FROM tokenizer_test WHERE title &@~ '京都';
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 44

PGroongaのトークナイザー
(TokenMecab)
SELECT * FROM tokenizer_test WHERE title &@~ '京都';
title
--------------------------------------
京都府 1日目 金閣寺
京都府 2日目 嵐山
京都府 3日目 天橋立
(3 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 45

PGroongaのトークナイザー
(TokenMecab)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 46

トークナイザーの指定方法
CREATE INDEX pgroonga_content_index
ON tokenizer_test
USING pgroonga (title)
WITH (tokenizer='TokenMecab');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 47

指定可能トークナイザー一覧
使用可能なトークナイザー
https://groonga.org/ja/docs/
reference/tokenizers.html
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 48

ステミング(語幹処理)
意味は同じだが
語の形が変わる
(語形変化)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 49

ステミング(語幹処理)
例えば
develop(原形)
developed(過去形)
developing(進行形)
意味は同じだが語形は異なる
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 50

ステミング(語幹処理)
語幹:単語の変化
しない部分
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 51

ステミング(語幹処理)
develop
developed
developing
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 52

ステミング(語幹処理)
語幹で検索
->語形変化後の語
も検索できる
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 53

PGroongaのステミング
(未使用)
CREATE TABLE steming_test (
title text
);
CREATE INDEX pgroonga_content_index ON steming_test USING pgroonga (title);
INSERT INTO steming_test VALUES ('I develop Groonga');
INSERT INTO steming_test VALUES ('I am developing Groonga');
INSERT INTO steming_test VALUES ('I developed Groonga');
SELECT * FROM steming_test WHERE title &@~ 'develop';
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 54

PGroongaのステミング
(未使用)
SELECT * FROM steming_test WHERE title &@~ 'develop';
title
-------------------
I develop Groonga
(1 row)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 55

PGroongaのステミング
CREATE TABLE steming_test (
title text
);
CREATE INDEX pgroonga_content_index
ON steming_test
USING pgroonga (title)
WITH (plugins='token_filters/stem',
token_filters='TokenFilterStem');
INSERT INTO steming_test VALUES ('I develop Groonga');
INSERT INTO steming_test VALUES ('I am developing Groonga');
INSERT INTO steming_test VALUES ('I developed Groonga');
SELECT * FROM steming_test WHERE title &@~ 'develop';
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 56

PGroongaのステミング
SELECT * FROM steming_test WHERE title &@~ 'develop';
title
-------------------------
I develop Groonga
I am developing Groonga
I developed Groonga
(3 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 57

高度な話題
処理順序
1. ノーマライズ
2. トークナイズ
3. トークンフィルター
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 58

高度な話題
処理順序が問題に
なることがある
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 59

高度な話題
TokenMecab と
unify_kana
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 60

高度な話題
「ワールドカップ」->
「わーるどかっぷ」
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 61

高度な話題
「ワールドカップ」 ->
「ワールドカップ」
「わーるどかっぷ」 ->
「わ/ー/る/ど/かっぷ」
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 62

高度な話題
処理順序
1. ノーマライズ
2. トークナイズ
3. トークンフィルター
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 63

高度な話題
TokenFilterNFKC
100を使う
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 64

高度な話題
TokenFilterNFKC100
働きは、NormalizerNFKC100と同じ
トークナイズ後にノーマライズしたい
ときに使う
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 65

同義語
同義語:同じ意味
を持つ別の語
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 66

同義語
例えば
「ミルク」と
「牛乳」
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 67

同義語
意味が同じものは
ヒットしてほしい
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 68

同義語展開
ミルク ->
ミルク OR 牛乳
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 69

PGroongaの同義語展開
CREATE TABLE synonyms (
term text PRIMARY KEY,
synonyms text[]
);
CREATE INDEX synonyms_search ON synonyms USING pgroonga (term pgroonga.text_term_search_ops_v2);
INSERT INTO synonyms (term, synonyms) VALUES ('ミルク', ARRAY['ミルク', '牛乳']);
INSERT INTO synonyms (term, synonyms) VALUES ('牛乳', ARRAY['牛乳', 'ミルク']);
CREATE TABLE memos (
id integer,
content text
);
INSERT INTO memos VALUES (1, '牛乳石鹸');
INSERT INTO memos VALUES (2, 'ミルクジャム');
INSERT INTO memos VALUES (3, 'ストロベリー');
CREATE INDEX pgroonga_content_index ON memos USING pgroonga (content);
SELECT * FROM memos
WHERE
content &@~
pgroonga_query_expand('synonyms', 'term', 'synonyms', '牛乳');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 70

同義語展開
SELECT * FROM memos
WHERE
content &@~
pgroonga_query_expand('synonyms', 'term', 'synonyms', '牛乳');
id |
content
----+--------------------
1 | 牛乳石鹸
2 | ミルクジャム
(2 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 71

fuzzy検索
typo対策
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 72

fuzzy検索
似たような語ならヒットする
(完全一致じゃなくてもヒットする)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 73

fuzzy検索
「テノクロジー」
で
「テクノロジー」
がヒット
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 74

fuzzy検索
編集距離
Aを何回操作するとBになるか
操作とは?
文字の挿入・削除・置換・隣接文字交
換
操作回数を距離とする
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 75

fuzzy検索
編集距離
A:テノクロジー
隣接文字交換:ク⇔ノ
B:テクノロジー
編集距離:1
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 76

PGroongaのfuzzy検索
CREATE TABLE tags (
name text
);
CREATE INDEX tags_search ON tags USING pgroonga(name) WITH (tokenizer='');
INSERT INTO tags VALUES ('テクノロジー');
INSERT INTO tags VALUES ('テクニカル');
SELECT name FROM tags
WHERE
name &`
('fuzzy_search(name, ' || pgroonga_escape('テノクロジー') || ',
{"with_transposition": true,
"max_distance": 1})');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 77

fuzzy検索
SELECT name FROM tags
WHERE
name &`
('fuzzy_search(name, ' || pgroonga_escape('テノクロジー') || ',
{"with_transposition": true,
"max_distance": 1})');
name
--------------------
テクノロジー
(1 row)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 78

PGroongaでランキング改善
何を基準に
ランキングを
決めるのか
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 79

PGroongaのスコアリング
TF(デフォルト)
TF-IDF
TF at Most
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 80

PGroongaのスコアリング
TF(デフォルト)
単語の出現数
が大事
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 81

PGroongaのスコアリング
TF(デフォルト)
検索キーワードが文書内に多く含
まれる文書のスコアーが高くなる
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 82

PGroongaのスコアリング
TF(デフォルト)
CREATE TABLE memos (
title text,
content text
);
CREATE INDEX pgroonga_memos_index
ON memos
USING pgroonga (content);
INSERT INTO memos VALUES ('PostgreSQL', 'PostgreSQLはリレーショナル・データベース管理システムです。');
INSERT INTO memos VALUES ('Groonga', 'Groongaは日本語対応の高速な全文検索エンジンです。');
INSERT INTO memos VALUES ('PGroonga', 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。');
INSERT INTO memos VALUES ('PGroonga1', 'PGroongaは全文検索エンジンGroongaを使っています。');
INSERT INTO memos VALUES ('PGroonga2', 'Groonga、Groonga、Groonga、Groonga、Groonga');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 83

PGroongaのスコアリング
TF(デフォルト)
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE content &@~ 'Groonga'
ORDER BY score DESC;
title
|
content
| score
-----------+---------------------------------------------------------------------------+-------
PGroonga2 | Groonga、Groonga、Groonga、Groonga、Groonga
|
5
| Groongaは日本語対応の高速な全文検索エンジンです。
|
1
Groonga
1
PGroonga | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 |
|
1
PGroonga1 | PGroongaは全文検索エンジンGroongaを使っています。
(4 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 84

PGroongaのスコアリング
TF-IDF
単語のレア度
が大事
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 85

PGroongaのスコアリング
TF-IDF
文書に出てくる頻度が高い
(レア度低い)
文書に出てくる頻度が低い
(レア度高い)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 86

PGroongaのスコアリング
TF-IDF
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE content &@~
('Groonga OR 全文検索',
ARRAY[1],
ARRAY['scorer_tf_idf($index)'],
'pgroonga_memos_index')::pgroonga_full_text_search_condition_with_scorers
ORDER BY score DESC;
title
|
content
| score
-----------+---------------------------------------------------------------------------+-------
Groonga
| Groongaは日本語対応の高速な全文検索エンジンです。
|
2
|
2
PGroonga1 | PGroongaは全文検索エンジンGroongaを使っています。
1
PGroonga | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 |
|
1
PGroonga2 | Groonga、Groonga、Groonga、Groonga、Groonga
(4 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 87

PGroongaのスコアリング
TF at Most
スコアーの
最大値を制限
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 88

PGroongaのスコアリング
TF at Most
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE content &@~ 'Groonga OR PostgreSQL'
ORDER BY score DESC;
title
|
content
| score
------------+---------------------------------------------------------------------------+-------
PGroonga2 | Groonga、Groonga、Groonga、Groonga、Groonga
|
5
| PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 |
2
PGroonga
| Groongaは日本語対応の高速な全文検索エンジンです。
|
1
Groonga
|
1
PGroonga1 | PGroongaは全文検索エンジンGroongaを使っています。
|
1
PostgreSQL | PostgreSQLはリレーショナル・データベース管理システムです。
(5 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 89

PGroongaのスコアリング
TF at Most
SELECT *, pgroonga_score(tableoid, ctid) AS score
FROM memos
WHERE content &@~
('Groonga OR 全文検索',
ARRAY[1],
ARRAY['scorer_tf_at_most($index, 1)'],
'pgroonga_memos_index')::pgroonga_full_text_search_condition_with_scorers
ORDER BY score DESC;
title
|
content
| score
-----------+---------------------------------------------------------------------------+-------
Groonga
| Groongaは日本語対応の高速な全文検索エンジンです。
|
2
|
2
PGroonga1 | PGroongaは全文検索エンジンGroongaを使っています。
1
PGroonga | PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。 |
|
1
PGroonga2 | Groonga、Groonga、Groonga、Groonga、Groonga
(4 rows)
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 90

参考資料
PGroonga自体の解説
https://www.slideshare.net/kou/
postgresql-conference-japan-2017
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 91

参考資料
ノーマライザーのオプション一覧
https://groonga.org/ja/docs/
reference/normalizers/
normalizer_nfkc130.html#paramet
ers
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 92

参考資料
使用可能なトークナイザー一覧
https://groonga.org/ja/docs/
reference/tokenizers.html
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 93

参考資料
ステミングの使用方法
https://pgroonga.github.io/ja/
reference/create-index-using-
pgroonga.html
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 94

参考資料
同義語検索の方法
https://pgroonga.github.io/ja/how-
to/synonyms.html
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 95

参考資料
使用可能なスコアラー一覧
https://groonga.org/ja/docs/
reference/scorer.html#built-in-
scorers
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 96

参考資料
スコアラーの設定方法
https://pgroonga.github.io/ja/
reference/operators/query-v2.html
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Other slides