iwasa****@nttda*****
iwasa****@nttda*****
2008年 3月 10日 (月) 12:43:56 JST
岩崎です。こんにちは。 > N-gramインデックスにて作成したフィールドの検索時に正しく検索結果が返って > きませんでしたので、原因がわかる方がおられればお知らせいただきたく思いま PostgreSQL8.3からはtsearch2という これまでcontribにあった機能が標準で入っているのですが、 tsearch2も@@演算子を定義しているため、 そちらの関数が実行されていることが原因だと思われます。 (細かくいえば、PostgreSQL8.2以前のtsearch2の場合は、 右辺と左辺にtext型を取る@@演算子は定義していなかったため、 Ludiaと共存させても問題ありませんでした。) PostgreSQLのshareディレクトリにインストールされたpgsenna2.sqlを、 編集して@@と書いてある部分を他と被っていないもの(例えば%%)と 置き換えて試してみていただけないでしょうか? (ソースからインストールを繰り返し行うのであれば、 ソースアーカイブに含まれるpgsenna2_83.sql.inを編集したほうが効率的です。) PostgreSQL8.3以降向けの演算子については、 次のLudiaのリリースで変更される予感です。 -----Original Message----- From: ludia****@lists***** [mailto:ludia****@lists*****] On Behalf Of hirok****@mx4***** Sent: Sunday, March 09, 2008 1:18 AM To: ludia****@lists***** Subject: [Ludia-users 199]PostgreSQL8.3の検索結果につきまして 小谷と申します。 よろしくお願いします。 N-gramインデックスにて作成したフィールドの検索時に正しく検索結果が返って きませんでしたので、原因がわかる方がおられればお知らせいただきたく思いま す。 PostgreSQLを8.3.0のバージョンものを使用しているせいかもしれませんが。。。 使用したソフトウェア環境は以下のとおりです。 Linux CentOS 5.0 Ludia 1.4.0 Sennna 1.0.9 mecab 0.96 PostgreSQL 8.3.0 検証用にThinkitの記事と同様のテーブルを作成しました。 http://www.thinkit.co.jp/cert/article/0612/8/4/3.htm また、PostgreSQL 8.2.3 + Ludia 1.3.1 の結果も載せておきます。 142件のレコードが返ってくるのが正常と思われます。 ■1. addressフィールドにのみ2-gramインデックスを作成 SELECT * FROM zip WHERE address @@ '*D+ 春日町' OR zipcode = '春日町'; -> Postgres8.2.3 + Ludia 1.3.1 正しくデータ取得 -> Postgres8.3.0 + Ludia 1.4.0 結果が0件 [explainの結果] Seq Scan on zip (cost=0.00..3507.68 rows=123 width=42) Filter: ((address @@ '*D+ 春日町'::text) OR ((zipcode)::text = '春日 町'::text)) ■2. zipフィールドにB-treeインデックスを作成 SELECT * FROM zip WHERE address @@ '*D+ 春日町' OR zipcode = '春日町'; -> Postgres8.2.3 + Ludia 1.3.1 正しくデータ取得 -> Postgres8.3.0 + Ludia 1.4.0 正しくデータ取得 [explainの結果] Bitmap Heap Scan on zip (cost=9.50..364.11 rows=123 width=42) Recheck Cond: ((address @@ '*D+ 春日町'::text) OR ((zipcode)::text = '春日町'::text)) -> BitmapOr (cost=9.50..9.50 rows=123 width=0) -> Bitmap Index Scan on idx_ngram (cost=0.00..5.17 rows=122 width=0) Index Cond: (address @@ '*D+ 春日町'::text) -> Bitmap Index Scan on idx_zipcode (cost=0.00..4.27 rows=1 width=0) Index Cond: ((zipcode)::text = '春日町'::text) ■3. addressフィールドにのみ2-gramインデックスを作成し、*D+を削除 SELECT * FROM zip WHERE address @@ '春日町' OR zipcode = '春日町'; -> Postgres8.2.3 + Ludia 1.3.1 正しくデータ取得 -> Postgres8.3.0 + Ludia 1.4.0 北海道紋別郡興部町興部(春日町)という データ1件のみ取得 [explainの結果] Seq Scan on zip (cost=0.00..3507.68 rows=123 width=42) Filter: ((address @@ '春日町'::text) OR ((zipcode)::text = '春日町':: text)) 以上、よろしくお願いいたします。 _______________________________________________ Ludia-users mailing list Ludia****@lists***** http://lists.sourceforge.jp/mailman/listinfo/ludia-users