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
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
normalizer_test
normalizer_test
normalizer_test
normalizer_test
normalizer_test
normalizer_test
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
(1,
(2,
(3,
(4,
(5,
(6,
'キログラム');
'きろぐらむ');
'㌕');
'キログラム');
'kiroguramu');
'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
ON
USING
WITH
pgroonga_content_index
normalizer_test
pgroonga (content)
(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
ON
USING
WITH
pgroonga_content_index
normalizer_test
pgroonga (content)
(normalizers='NormalizerNFKC130("unify_to_romaji", true)');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 37

複数オプションの指定方法
CREATE INDEX
ON
USING
WITH
pgroonga_content_index
normalizer_test
pgroonga (content)
(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
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
tokenizer_test
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
('京都府
('京都府
('京都府
('東京都
('東京都
('北海道
('北海道
('北海道
('北海道
('北海道
1日目
2日目
3日目
1日目
2日目
1日目
2日目
3日目
4日目
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
ON
USING
WITH
pgroonga_content_index
tokenizer_test
pgroonga (title)
(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
ON
USING
WITH
pgroonga_content_index
tokenizer_test
pgroonga (title)
(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
title text
);
CREATE INDEX
ON
USING
WITH
steming_test (
pgroonga_content_index
steming_test
pgroonga (title)
(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
ON
USING
INSERT
INSERT
INSERT
INSERT
INSERT
INDEX pgroonga_memos_index
memos
pgroonga (content);
INTO memos VALUES ('PostgreSQL', 'PostgreSQLはリレーショナル・データベース管理システムです。');
INTO memos VALUES ('Groonga', 'Groongaは日本語対応の高速な全文検索エンジンです。');
INTO memos VALUES ('PGroonga', 'PGroongaはインデックスとしてGroongaを使うためのPostgreSQLの拡張機能です。');
INTO memos VALUES ('PGroonga1', 'PGroongaは全文検索エンジンGroongaを使っています。');
INTO memos VALUES ('PGroonga2', 'Groonga、Groonga、Groonga、Groonga、Groonga');
PGroongaを使って 全文検索結果を より良くする方法
Powered by Rabbit 3.0.1

Page: 83

PGroongaのスコアリング
TF(デフォルト)
SELECT
FROM
WHERE
ORDER
*, pgroonga_score(tableoid, ctid) AS score
memos
content &@~ 'Groonga'
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