12

我有一个场景,我发布了数千个按特定类别/关键字分类的组件演示文稿,但这些组件还具有与定义前n相关的自定义元数据字段。将显示。本质上,我需要根据关键字过滤一组组件,根据自定义元数据对它们进行排序,并且只选择前 N 个。

我了解如何列出项目并创建基本过滤器(来自 API 中的过滤器项目列表),但我需要过滤元数据字段(例如,具有最新元数据“priorityDate”的三个项目)。

从我正在阅读的内容来看,我应该从分类搜索中获取所有记录(使用 TaxonomyKeywordCriteria),然后手动(对 QueryRunner 执行 SQL)检索所有组件的元数据以进行过滤/排序。

我肯定错过了一些东西(感觉不对,有 1/2 API 调用,然后在页面 SQL 脚本中)......如果没有,QueryRunner 查询是否会与分类 Query.executeQuery() 的结果一起缓存

示例代码:

ItemTypeCriteria isComponent = new ItemTypeCriteria(16);
TaxonomyKeywordCriteria taxonomyKeywordCriteria = new TaxonomyKeywordCriteria(taxURI, taxKeywordURI, true);
Criteria[] allCriteria = {isComponent, isTDIPublication, isArticle, taxonomyKeywordCriteria}; 
AndCriteria andCriteria = CriteriaFactory.And(allCriteria);
Query query = new Query();         
query.setCriteria(andCriteria);
4

1 回答 1

12

在您的 JSP 中使用 SQL 似乎并不合适,因为它是数据层逻辑,不应出现在演示文稿中。此外,如果 Tridion 使用新版本更新数据库结构,则您的自定义 SQL 可能会停止工作。您最好使用 Broker API,而不是依赖于 Broker DB 中的自定义 SQL 语句。

我认为你最好的选择是尽量减少所需的数据库命中次数。API 允许按关键字过滤(您也可以按自定义元进行过滤,但这对您没有帮助,因为您提到要按给定的自定义元字段排序)。您有两个选项可以按关键字获取 CP 列表,然后您可以对其进行排序:

  1. 查询.execureQuery()。这将返回一个 tcm URI 列表,这意味着必须进行单独的 DB 命中来检索 CustomMetadata 对象和 CP (ComponentPresentationFactory.GetComponentPresetation(tcmUri))。在所有内容都被充分缓存之前,这可能(并且可能会)变得很重。
  2. ComponentPresentationFactory.getTaxonomyComponentPresentations()。您可以将一组关键字传递给此方法并获取更大的 CP 集。这意味着一个快速的数据库查询。在 CM 方面,在组件模板中添加自定义元字段值的呈现作为 HTML 注释。然后回到交付端,只需从返回集的每个 CP 中解析出该值,并在应用程序服务器(而不是 DB)上进行排序。这将比执行许多数据库查询更快。

您的问题主题要求提供一些分类查询示例。查看 2011 文档中的 sdllivecontent 门户。API 与 2009 年的 API 几乎相同(只有细微的差别,但是,这里提供了一些关于构建过滤器的示例: http ://sdllivecontent.sdl.com/LiveContent/web/pub.xql?action=home&pub =SDL_Tridion_2011&lang=en-US#addHistory=true&filename=DevelopingAFilter.xml&docid=concept_0AB6D192D7AB4EC18892631F519EF1DD&inner_id=&tid=&query=&scope=&resource=&eventType=lcContent.loadDocconcept_0AB6D192D7AB4EC18892631F51EF

如果您浏览主题,sdltridionworld 论坛是另一个好地方。以下是一些带有一些示例代码的线程:

  1. https://forum.sdltridion.com/topic.asp?TOPIC_ID=6690&SearchTerms=taxonomy,query
  2. https://forum.sdltridion.com/topic.asp?TOPIC_ID=5619&SearchTerms=taxonomy,query
于 2012-04-26T00:27:12.900 回答