从2个表填充Oracle Text搜索列

时间:2015-10-09 10:54:57

标签: sql database oracle full-text-search text-search

我正在调查Oracle Text搜索的好处,目前我正在研究从多个(相关)表中收集搜索文本数据,并将这些数据以1对多的关系存储在较小的表中。

考虑这两个简单的表,房子和居民,并且从来没有任何无人居住的房子:

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

我想编写使用INHABITANT中的文本更新HOUSE.Search_Text列的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_ID和Search_Text的新表更有效率,而不是更新House?

0 个答案:

没有答案