[Ludia-users 149] Re: 複数のテーブルに対する全文検索について

Back to archive index

kousa****@nttda***** kousa****@nttda*****
2007年 12月 13日 (木) 17:29:59 JST


幸坂です。

このクエリで、いかがでしょうか?
select * from
(select * from table1 where data @@ 'test') AS t1,
(select * from table2 where data @@ 'test') AS t2
WHERE t1.id = t2.id;

速度だけを考えるならば、
table1とtable2を結合したテーブルを定義し、
マルチカラムインデックス(もしくは配列型インデックス)を張ると、
高速になります。

> -----Original Message-----
> From: ludia****@lists***** 
> [mailto:ludia****@lists*****] On Behalf Of ssenou
> Sent: Thursday, December 13, 2007 5:04 PM
> To: ludia****@lists*****
> Subject: [Ludia-users 148] Re:複数のテーブルに対する全文検索について
> 
> 瀬能です。
> すいません、括弧をつけ忘れていました。
> 正しくは下記です。
> 
> SELECT * FROM table1,table2
> WHERE
> table1.id = table2.id AND
> (table1.data @@ 'TEST' or table2.data @@ 'TEST')
> 
> 
> 勘違いしていた様で、少し質問を変えさせて下さい。
> 
> table1.dataを件名
> table2.dataを本文
> と見なし
> 検索対象が"件名又は本文"の場合という検索で
> 全文検索を実行させたい場合、何かいい方法ありませんか?
> 
> これくらいしか思い付かなかったのですが…
> SELECT * FROM table1,table2
> WHERE
> (select id from table1 where data @@ 'AAA') = (select id from 
> table2 where 
> data @@ 'AAA')
> 
> よろしくお願いします。
> 
> ----- Original Message ----- 
> From: <kousa****@nttda*****>
> To: <ludia****@lists*****>
> Sent: Thursday, December 13, 2007 4:04 PM
> Subject: [Ludia-users 147] Re: 複数のテーブルに対する全文検索について
> 
> 
> > 幸坂です。
> >
> > SELECT * FROM table1,table2
> > WHERE
> > table1.id = table2.id AND
> > (table1.data @@ 'TEST' or table2.data @@ 'TEST');
> > と間違えていませんか?
> >
> >> SELECT * FROM table1,table2
> >> WHERE
> >> table1.id = table2.id AND
> >> table1.data @@ 'TEST' or table2.data @@ 'TEST'
> > ORよりANDのほうが優先順位が高いため、このクエリは、
> > SELECT * FROM table1,table2
> > WHERE
> > (table1.id = table2.id AND
> > table1.data @@ 'TEST') or table2.data @@ 'TEST';
> > と同じです。
> >
> > 
> http://www.postgresql.jp/document/pg825doc/html/sql-syntax-lex
> ical.html
> > 表 4-1. 演算子の優先順位(強いものから)
> >
> >> -----Original Message-----
> >> From: ludia****@lists*****
> >> [mailto:ludia****@lists*****] On 
> Behalf Of ssenou
> >> Sent: Thursday, December 13, 2007 3:15 PM
> >> To: ludia****@lists*****
> >> Subject: [Ludia-users 146] Re:複数のテーブルに対する全文検索について
> >>
> >> すいません。
> >>
> >> クエリを間違えていました。
> >>
> >> 下記でお願いします。
> >>
> >> SELECT * FROM table1,table2
> >> WHERE
> >> table1.id = table2.id AND
> >> table1.data @@ 'TEST' or table2.data @@ 'TEST'
> >>
> >>
> >> ----- Original Message ----- 
> >> From: <kousa****@nttda*****>
> >> To: <ludia****@lists*****>
> >> Sent: Thursday, December 13, 2007 2:33 PM
> >> Subject: [Ludia-users 145] Re: 複数のテーブルに対する全文検索について
> >>
> >>
> >> > 幸坂です。
> >> >
> >> >>> ・postgresql.conf にenable_seqscan = off と記述する。
> >> >> この設定をして明示的にERRORが発生するようにしています。
> >> > enable_seqscanとludia.enable_seqscanは別です。
> >> > enable_seqscanをoffにすると、シーケンシャルスキャンのコストが高くな
り、
> >> > インデックススキャンが使われやすくなります。
> >> > Ludia以外のコストも変わってしまうので注意して下さい。
> >> > 瀬能さんが設定したludia.enable_seqscan = offは、
> >> > シーケンシャルスキャンの時にERRORが発生しますが、
> >> > コスト計算とは全く関係ありません。
> >> > enable_seqscanを試してみてください。
> >> >
> >> >
> >> >>>> SELECT * FROM test1,test2
> >> >>>> WHERE table1.data @@ 'TEST' or table2.data @@ 'TEST'
> >> > このクエリは、table1で1件以上ヒットすると、
> >> > table2のレコードが全て結果レコードに含まれます。
> >> > つまり、table2は全レコードがアクセスされる可能性が高いです。
> >> > 同様に、table1も全レコードがアクセスされる可能性が高いです。
> >> >
> >> > 全レコードがアクセスされている場合にインデックススキャンを行うと、
> >> > 全レコードに加えてインデックスにもアクセスする必要があり、
> >> > ディスクアクセスが多くなってしまいます。
> >> > そのため、今回のプランではシーケンシャルスキャンが選択されています。
> >> >
> >> > クエリは間違っていないですよね?
> >> >
> >> >> -----Original Message-----
> >> >> From: ludia****@lists*****
> >> >> [mailto:ludia****@lists*****] On
> >> Behalf Of ssenou
> >> >> Sent: Thursday, December 13, 2007 11:53 AM
> >> >> To: ludia****@lists*****
> >> >> Subject: [Ludia-users 144] Re:複数のテーブルに対する全文検索について
> >> >>
> >> >> 回答ありがとうございます。
> >> >>
> >> >> > レコードが1行しかないため、シーケンシャルスキャンのほうが
> >> >> > 高速と判断されています。
> >> >>
> >> >> データを10万行でも試してみたのですが、
> >> >> 1行も10万行も実行計画に変化が無いので
> >> >> サンプルを1行として質問していました。
> >> >>
> >> >> > ・postgresql.conf にenable_seqscan = off と記述する。
> >> >>
> >> >> この設定をして明示的にERRORが発生するようにしています。
> >> >>
> >> >> ludia1.3系や従来のコスト計算モードでも試したのですが、
> >> >> 結果は同じでした。
> >> >>
> >> >> 以上よろしくお願いします。
> >> >>
> >> >>
> >> >> ----- Original Message ----- 
> >> >> From: <kousa****@nttda*****>
> >> >> To: <ludia****@lists*****>
> >> >> Sent: Thursday, December 13, 2007 11:40 AM
> >> >> Subject: [Ludia-users 143] Re: 複数のテーブルに対する全文検索につい
て
> >> >>
> >> >>
> >> >> > 幸坂です。こんにちは。
> >> >> >
> >> >> > レコードが1行しかないため、シーケンシャルスキャンのほうが
> >> >> > 高速と判断されています。
> >> >> >
> >> >> > ・レコード数を増やす。
> >> >> > ・postgresql.conf にenable_seqscan = off と記述する。
> >> >> >
> >> >> > などの方法を用いれば、インデックススキャンが利用されるはずです。
> >> >> >
> >> >> >> -----Original Message-----
> >> >> >> From: ludia****@lists*****
> >> >> >> [mailto:ludia****@lists*****] On
> >> >> Behalf Of ssenou
> >> >> >> Sent: Thursday, December 13, 2007 11:27 AM
> >> >> >> To: ludia****@lists*****
> >> >> >> Subject: [Ludia-users 142]複数のテーブルに対する全文検索について
> >> >> >>
> >> >> >> 瀬能です。
> >> >> >> お世話になっています。
> >> >> >>
> >> >> >> 質問があるのですが、
> >> >> >> 複数のテーブル(text型カラム)に対する複数の@@検索を実行すると
> >> >> >> 必ずシーケンシャルスキャンになってしまうのですが、
> >> >> >> 複数のテーブル(text型カラム)に対する複数の@@検索は想定していない
仕様 
> >> >> >> 
> > で
> >> > す
> >> >> > か?
> >> >> >> (SQL文で対応出来ない事もないですが、できるだけ自由な記述をしたい
と
> > 思っ
> >> > てい
> >> >> >>
> >> >> > るので…)
> >> >> >> また、回避方法などあれば教えてください。
> >> >> >>
> >> >> >> 以上よろしくお願いします。
> >> >> >>
> >> >> >> ■環境
> >> >> >> Redhat Enterprise Linux 4 U5
> >> >> >> ludia 1.4.0 (mecab-0.96 ipadic-2.7.0 senna-1.0.9
> >> >> >> postgresql 8.2.4
> >> >> >>
> >> >> >> ■設定
> >> >> >> postgres.conf
> >> >> >> ・ludia.max_n_sort_result = 100000
> >> >> >> ・ludia.enable_seqscan = off
> >> >> >> ・ludia_sen_index_flags = 31
> >> >> >> ・ludia.max_n_index_cache = 16
> >> >> >> ・ludia.initial_n_segments = 2048
> >> >> >> ・ludia.usegenericcost = on or off共に
> >> >> >>
> >> >> >> ■DB
> >> >> >> ・table1(構成)  : id(key) int4,data text
> >> >> >> ・table2(構成)  : id(key) int4,data text
> >> >> >> ・table1(DATA)  : id = 1,data = "TEST"
> >> >> >> ・table2(DATA)  : id = 1,data = "TEST"
> >> >> >> ・table1(INDEX) : fulltextb
> >> >> >> ・table2(INDEX) : fulltextb
> >> >> >>
> >> >> >> ■現象
> >> >> >> SELECT * FROM test1,test2
> >> >> >> WHERE table1.data @@ 'TEST' or table2.data @@ 'TEST'
> >> >> >>
> >> >> >> と実行すると
> >> >> >>
> >> >> >> "Nested Loop  (cost=0.00..2.04 rows=1 width=24)"
> >> >> >> "  Join Filter: ((table1.data @@ 'TEST'::text) OR
> >> (table2.data @@
> >> >> >> 'TEST'::text))"
> >> >> >> "  ->  Seq Scan on table1  (cost=0.00..1.01 rows=1 width=12)"
> >> >> >> "  ->  Seq Scan on table2  (cost=0.00..1.01 rows=1 width=12)"
> >> >> >>
> >> >> >> とシーケンシャルスキャンになってしまいます。
> >> >> >>
> >> >> >> _______________________________________________
> >> >> >> Ludia-users mailing list
> >> >> >> Ludia****@lists*****
> >> >> >> http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> >> >> >>
> >> >> >
> >> >> > _______________________________________________
> >> >> > Ludia-users mailing list
> >> >> > Ludia****@lists*****
> >> >> > http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> >> >> >
> >> >> >
> >> >>
> >> >> _______________________________________________
> >> >> Ludia-users mailing list
> >> >> Ludia****@lists*****
> >> >> http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> >> >>
> >> >
> >> > _______________________________________________
> >> > Ludia-users mailing list
> >> > Ludia****@lists*****
> >> > http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> >> >
> >> >
> >>
> >> _______________________________________________
> >> Ludia-users mailing list
> >> Ludia****@lists*****
> >> http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> >>
> >
> > _______________________________________________
> > Ludia-users mailing list
> > Ludia****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> >
> > 
> 
> _______________________________________________
> Ludia-users mailing list
> Ludia****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/ludia-users
> 




Ludia-users メーリングリストの案内
Back to archive index