1

私は 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

いくつかの質問:

  1. これは、このデータを返すための効率的なクエリですか? 微妙に違うのが気になります。
  2. これは、複数のテキスト・フィールドでOracle Text検索を使用する正しい方法ですか?
  3. 上記の結果で House.Search_Text を更新するにはどうすればよいですか? 相関サブクエリが必要だと思いますが、うまくいきません。
  4. House を更新するよりも、House_ID と Search_Text のみを含む新しいテーブルを作成する方が効率的でしょうか?
4

0 に答える 0