Oracle 11g Text:复合域索引 - 来自不同表的列的FILTER BY

时间:2012-05-09 16:06:57

标签: oracle indexing dns composite oracle-text

我使用的是Oracle 11g Text,

AuthorTable :(作者详情的表格) AuthorId,AuthorName,AuthorDOB

ArticleTable :(文章内容表)ArticleId,WrittenDate,PublishDate,ARTICLE_TXT(CLOB)

LocationTable :(位置表)LocationId,LocationState,LocationCity

ArticleAuthorAssocTable :(文章 - 作者协会表)AuthorId,ArticleId

LocAuthorAssocTable :(作者 - 位置关联表)AuthorId,LocationId,LocationStartDate,LocationEndDate

我的查询需要在ARTICLE_TXT上搜索任何输入搜索词以及PublishDate / WrittenDate / AuthorDOB / LocationCity / LocationStartDate范围内的任何其他查询。

由于我必须进行混合查询,因此我开始在ArticleTable上创建复合域索引CDI。

    CREATE INDEX ARTICLE_TXT_CDI_IDX ON ArticleTable(ARTICLE_TXT) 
    INDEXTYPE IS ctxsys.CONTEXT 
    FILTER BY WrittenDate, PublishDate

和查询

SELECT 

/*+ domain_index_sort domain_index_filter(ARTICLE_TXT_CDI_IDX) */      article.ARTICLE_TXT, 

author.AuthorName , article.WrittenDate, article.PublishDate, LocationTable.LocationCity ,location.LocationStartDate, location.LocationEndDate 

FROM 

  ArticleTable article

  INNER JOIN 
  ArticleAuthorAssocTable  articleAuthorAssoc ON article.articleId = articleAuthorAssoc .articleId 

  INNER JOIN 
  AuthorTable author ON author.authorId= articleAuthorAssoc.authorId

  INNER JOIN 
  LocAuthorAssocTable locAuthorAssoc req ON author.authorId = locAuthorAssoc.authorId

INNER JOIN 
  LocationTable location ON location .authorId = locAuthorAssoc.authorId

WHERE

 CONTAINS(article.ARTICLE_TXT, 'Something') >0

 AND author.AuthorDOB BETWEEN TO_DATE('01/01/2001','MM/DD/YYYY') 
AND TO_DATE('12/31/2012','MM/DD/YYYY')

 AND location.LocationId IN (1,2)

现在我的问题是:

  1. 是否可以使用FILTER BY创建复合域索引     来自不同表格的列?
  2. 有没有其他方法可以改善上述查询?
  3. 根据我的研究,一些选项使用物化视图,基于函数的索引,USER_DATASTORE

    但不幸的是仍然不确定如何使用它们......请帮助我了解你的知识。

    由于

1 个答案:

答案 0 :(得分:0)

我认为此问题的最佳解决方案是在ArticleTable中添加XML列,您可以在其中组合文章的所有必需信息。

然后,您需要在涉及的表中添加触发器,以便在发生数据更改时重新创建此xml。

通过这种方式,您可以索引此xml列并使用节组搜索非常具体的信息(例如'PATH_SECTION_GROUP')