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

Back to archive index

ssenou sseno****@techn*****
2007年 12月 13日 (木) 17:04:06 JST


瀬能です。
すいません、括弧をつけ忘れていました。
正しくは下記です。

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-lexical.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 メーリングリストの案内
Back to archive index