私は Oracle Text 検索の利点を調査しており、現在、複数の (関連する) テーブルから検索テキスト データを収集し、そのデータを 1 対多の関係で小さいテーブルに格納することを検討しています。
これらの 2 つの単純なテーブル、家と住民を考えてみましょう。無人の家は決してありません。
HOUSE
ID Address Search_Text
1 44 Some Road
2 31 Letsby Avenue
3 18 Moon Crescent
INHABITANT
ID House Name Nickname
1 1 Jane Doe Janey
2 1 John Doe JD
3 2 Jo Smythe Smithy
4 2 Percy Plum PC
5 3 Apollo Lander Moony
HOUSE.Search_Text 列を INHABITANT からのテキストで更新する SQL を作成したいと考えています。これは 1 対多であるため、SQL は社内で一致する行ごとに INHABITANT のデータを照合し、データを (カンマ区切りで) 結合して Search_Text フィールドを更新する必要があります。
完了すると、HOUSE.Search_Text の Oracle Text 検索索引によって、検索条件に一致する HOUSE が返され、それに応じて INHABITANT を検索できます。
もちろん、これは非常に単純化された例です。多くの列からデータを取得し、両方のテーブルのフィールド全体で全文検索を行いたいと考えています。
同僚の助けを借りて、次のことができました。
select id, ADDRESS||'; '||Names||'; '||Nicknames as Search_Text
from house left join(
SELECT distinct house_id,
LISTAGG(NAME, ', ') WITHIN GROUP (ORDER BY NAME) OVER (PARTITION BY house_id) as Names,
LISTAGG(NICKNAME, ', ') WITHIN GROUP (ORDER BY NICKNAME) OVER (PARTITION BY house_id) as Nicknames
FROM INHABITANT)
i on house.id = i.house_id;
戻り値:
1 44 Some Road; Jane Doe, John Doe; JD, Janey
2 31 Letsby Avenue; Jo Smythe, Percy Plum; PC, Smithy
3 18 Moon Crescent; Apollo Lander; Moony
いくつかの質問:
- これは、このデータを返すための効率的なクエリですか? 微妙に違うのが気になります。
- これは、複数のテキスト・フィールドでOracle Text検索を使用する正しい方法ですか?
- 上記の結果で House.Search_Text を更新するにはどうすればよいですか? 相関サブクエリが必要だと思いますが、うまくいきません。
- House を更新するよりも、House_ID と Search_Text のみを含む新しいテーブルを作成する方が効率的でしょうか?