須藤様
お世話になります。ご教示ありがとうございます。内山です。
結果の explain です。
moovle=# explain ( analyze, buffers ) with v as
( SELECT id, content FROM subtitled WHERE content &@~ 'algorithm'
ORDER BY pgroonga_score( tableoid, ctid) DESC OFFSET 0 LIMIT 100 )
SELECT id, array_to_json( v.content ) FROM v;
QUERY PLAN
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------
CTE Scan on v
(cost=39163.48..39165.73 rows=100 width=40)
(actual time=58.567..208.771 rows=100 loops=1)
Buffers: shared hit=20239 read=504
CTE v
-> Limit
(cost=39163.23..39163.48 rows=100 width=377)
(actual time=56.933..56.972 rows=100 loops=1)
Buffers: shared hit=20013
-> Sort (cost=39163.23..39253.93 rows=36282 width=377)
(actual time=56.932..56.964 rows=100 loops=1)
Sort Key: (pgroonga_score(subtitled.tableoid, subtitled.ctid))
DESC
Sort Method: top-N heapsort Memory: 32kB
Buffers: shared hit=20013
-> Index Scan using subtitled_pgroonga_content_idx on subtitled
(cost=0.00..37776.56 rows=36282 width=377)
(actual time=31.602..54.725 rows=10371 loops=1)
Index Cond: (content &@~ 'algorithm'::text)
Buffers: shared hit=20010
Planning time: 33.601 ms
Execution time: 209.069 ms
(14 行)
となりました。十分使用に耐えます。実際、先ほどから Moovle は、pgroonga_score で
検索順位をつけています。
あと、pgroonga_score はチュートリアルにも書いてある一般的な関数で
あるのに、それを使って検索順位を付けられることに気づかず、申し訳ありません
でした。よく読んだら、検索順位の付け方も書いてありますね。
これからもよろしくお願いします。
-----Original Message-----
From: groonga-dev <groon****@lists*****> On Behalf Of Kouhei Sutou
Sent: Tuesday, January 8, 2019 7:38 PM
To: groon****@lists*****
Subject: [groonga-dev,04721] Re: PGroonga における検索スコア
須藤です。
In <000201d4a562$16ba6780$442f3680$@mirror.ocn.ne.jp>
"[groonga-dev,04720] PGroonga における検索スコア" on Sun, 6 Jan 2019 10:49:40 +0900,
<toshio_uchiy****@mirro*****> wrote:
> ここで、ORDER BY 句では、PostgreSQL の関数を使って検索語
> algorithm の出現回数を計算しています。
出現回数pgroonga_score()で得られるので次のようにしてみてくだ
さい。
with v AS
( SELECT id, content FROM subtitled WHERE content &@~ 'algorithm'
ORDER BY pgroonga_score(tableoid, ctid) DESC OFFSET 0 LIMIT 100 ) SELECT id, array_to_json( v.content ) FROM v;
> PGroonga でも、全文検索する文章に依存したスコアリング方法は
> ないでしょうか。ただし、content 列は text 型の配列です。
pgroonga_score()がそれです。
https://pgroonga.github.io/ja/reference/functions/pgroonga-score.html
スコアリング方法は次のように
pgroonga_full_text_search_condition_with_scorersを使うとカス
タマイズできます。これは3回以上出現してもそれ以上カウントし
ない例です。
content &@~ ('algorithm', null, 'scorer_tf_at_most($index, 3)', null):pgroonga_full_text_search_condition_with_scorers
参考:
* https://pgroonga.github.io/ja/reference/operators/query-v2.html
* http://groonga.org/ja/docs/reference/scorer.html
--
須藤 功平 <kou****@clear*****>
株式会社クリアコード <https://www.clear-code.com/>
Groongaベースの全文検索システムを総合サポート:
http://groonga.org/ja/support/
データ処理ツールの開発:
https://www.clear-code.com/blog/2018/7/11.html
_______________________________________________
groonga-dev mailing list
groon****@lists*****
https://lists.osdn.me/mailman/listinfo/groonga-dev