14. 確かにN-gramだけで
は無理っす
meros=# SELECT data FROM test
WHERE data LIKE likequery('セリヌンティウス') LIMIT 1;
data
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
------------------
------------
メロスには竹馬の友があった。セリヌンティウスである。今は此のシラクスの市で、石工
をしている。その友を、これから訪ねてみるつもりなのだ。久しく逢わなかったのだか
ら、訪ねて行くのが楽しみである。
(1 row)
meros=# SELECT data FROM test
WHERE data LIKE likequery('センヌリティウス') LIMIT 1;
data
------
(0 rows)
ですよねー
26. 確かにN-gramだけで
は無理っす
SELECT data FROM meros WHERE data LIKE likequery(
(SELECT data FROM token WHERE data % 'センヌリティウス' ORDER BY similarity(data, 'センヌリティ
ウス') DESC)
) LIMIT 3;
data
-------------------------------------------------------------------------------------------------
--------------------------------------------------
-------------------------------------------------------------------------------------------------
メロスには竹馬の友があった。セリヌンティウスである。今は此のシラクスの市で、石工をしている。その
友を、これから訪ねてみるつもりなのだ。久しく逢わなかったのだから、訪ねて行くのが楽しみである。
「そうです。帰って来るのです。」メロスは必死で言い張った。「私は約束を守ります。私を、三日間だけ
許して下さい。妹が、私の帰りを待っているのだ。そんなに私を信じられないならば、よろしい、この市に
セリヌンティウスという石工がいます。私の無二の友人だ。あれを、人質としてここに置いて行こう。私が
逃げしまって、三日目の日暮まで、ここに帰って来なかったら、あの友人を絞め殺して下さい。たのむ、そ
うして下さい。」
メロスは腕に唸《うな》りをつけてセリヌンティウスの頬を殴った。
(3 rows)
やったね☆
27. 確かにN-gramだけで
は無理っす
EXPLAIN
SELECT data FROM meros WHERE data LIKE likequery(
(SELECT data FROM token WHERE data % 'センヌリティウス' ORDER BY similarity(data, 'センヌリティ
ウス') DESC)
) LIMIT 3;
QUERY PLAN
--------------------------------------------------------------------------------------------
Limit (cost=56.04..60.06 rows=1 width=32)
InitPlan 1 (returns $0)
-> Sort (cost=44.03..44.04 rows=1 width=32)
Sort Key: (similarity(token.data, 'センヌリティウス'::text))
-> Bitmap Heap Scan on token (cost=40.01..44.02 rows=1 width=32)
Recheck Cond: (data % 'センヌリティウス'::text)
-> Bitmap Index Scan on token_data_idx (cost=0.00..40.01 rows=1 width=0)
Index Cond: (data % 'センヌリティウス'::text)
-> Bitmap Heap Scan on meros (cost=12.01..16.02 rows=1 width=32)
Recheck Cond: (data ~~ likequery($0))
-> Bitmap Index Scan on meros_data_idx (cost=0.00..12.01 rows=1 width=0)
Index Cond: (data ~~ likequery($0))
(12 rows)
インデクスもきちんと使われる
36. こんな感じ
SELECT data FROM test WHERE data LIKE likequery(
(SELECT token FROM token WHERE token % 'インタフェース'
ORDER BY similarity(token, 'インタフェース') DESC)
);
ERROR: more than one row returned by a subquery used as an expression
SELECT data FROM test WHERE data LIKE likequery(
(SELECT token FROM token WHERE token % 'インタフェース'
ORDER BY similarity(token, 'インタフェース') DESC LIMIT 1)
)
40. こんな感じ
SELECT data FROM test WHERE data LIKE ANY (
(SELECT array_agg(sml.token) FROM (SELECT likequery(token) AS token
FROM token
WHERE token % 'インタフェース'
ORDER BY similarity(token, 'インタフェース') DESC LIMIT 5) as sml)::text[]
);
%演算子で辞書を検索
一番近いN件をORDER Byで取得
その結果をarray_aggで配列化
そのサブクエリの結果をtext[]でキャスト
配列をLIKE ANYで評価
41. こんな感じ
SELECT data FROM test WHERE data LIKE ANY (
(SELECT array_agg(sml.token) FROM (SELECT likequery(token) AS token
FROM token
WHERE token % 'インタフェース'
ORDER BY similarity(token, 'インタフェース') DESC LIMIT 5) as sml)::text[]
);
data
---------------------------------------------------------------------------
今月号のインターフェースはコンパイラ特集だ。
実装はユーザインタフェースだけでなく、ユーザエクスペリエンスを考えねばならない。
発注元との意識ずれでインタフェイスの再設計をすることになった。
僕の考えた最強のユーザー・インターフェイスは却下された。
(4 rows)
やったね☆
44. こんな感じ
CREATE OR REPLACE FUNCTION create_synonyms(keyword text, limit_num int)
RETURNS text[] AS $$
SELECT array_append(array_agg(sml.token), likequery(keyword)) FROM
(SELECT likequery(token) AS token FROM token
WHERE token % keyword ORDER BY similarity(token, keyword)
DESC LIMIT limit_num) as sml;
$$ LANGUAGE sql;
46. こんな感じ
SELECT data FROM test WHERE data LIKE ANY
((SELECT create_synonyms('インタフェース', 5))::text[]);
data
------------------------------------------------------------------------
今月号のインターフェースはコンパイラ特集だ。
実装はユーザインタフェースだけでなく、ユーザエクスペリエンスを考えねばならない。
発注元との意識ずれでインタフェイスの再設計をすることになった。
僕の考えた最強のユーザー・インターフェイスは却下された。
やったね☆
50. こんな感じ
SELECT data FROM test WHERE data LIKE ANY
((SELECT create_synonyms('ライスカレー'))::text[]);
data
------------------------------------------------------------
彼女は言った。「カレーライスが嫌いな男子なんていません!」
昨晩食べたライスカレーはとても美味かった。
(2 rows)
56. こんな感じ
SELECT * FROM test WHERE data LIKE ANY
((SELECT create_synonyms2('小田原市'))::text[]);
data
--------------------------------------------------------------
神奈川の西部には小田原ラーメンというカテゴリの醤油ラーメンがある。
源平の戦いの英雄の一人、那須与一の郷は栃木の大田原市である。
私はコーディングスタイルには然程こだわらないようにしている。
僕は小市民の星を目指している。面倒事は勘弁してくれ。
(4 rows)
(゜Д゜)ハァ?