全文検索で二つ以上の項目を検索する時の挙動
全文検索を行う場合のテーブル設計メモ。
[記事]テーブルに以下のような項目が入っていた場合。
タイトル | 東京の予報
本文 | 今日の天気は....
- SELECT
- *
- FROM
- 記事
- WHERE
- ( to_tsvector('japanese', タイトル ) @@ to_tsquery('東京 & 天気') )
- OR ( to_tsvector('japanese', 本文 ) @@ to_tsquery('東京 & 天気') )
のように検索すると記事がHITしない。
( なぜHITしないかの説明は割愛 )
( to_tsvector('japanese', タイトル ) || ( to_tsvector('japanese', 本文 ) ) @@ to_tsquery('東京 & 天気')
のように to_tsvector 関数の連結が思いつくが、この処理は重たすぎてまったく役に立たない。
(この式自体にインデックス張ったらどうなるか...... 後で試す。)
思いついた限り、解決策としては、
1. 本文の中に単語を詰め込む。
タイトル | 東京の予報
本文 | 今日の東京の天気予報です。
to_tsvector('japanese', 本文 ) ) @@ to_tsquery('東京 & 天気')
2. 全文検索用の項目が自動で作成されるような仕組みを考える。
タイトル | 東京の予報
本文 | 今日の天気は....
検索項目 | 東京の予報 今日の天気は....
to_tsvector('japanese', 検索項目 ) ) @@ to_tsquery('東京 & 天気')
(検索項目だけテーブル別の方が良いかもしれない)
全文検索の対象項目は一つだけにするべし。
追記:
「詳細編集」なる機能を発見したので、過去の記事とか見やすくしてみます。