自定义Tridion搜索索引处理程序:页面URL的自定义与标准字段?

时间:2012-08-09 10:29:42

标签: search tridion tridion-2011

我正在玩SDL Tridion 2011(GA)的自定义搜索索引处理程序。我使用very helpful information provided by Arjen得到了一些工作,但我不确定我的执行是否是最佳选择。

要求是能够通过URL搜索CMS中的页面(例如www.example.com/news/index.html)。为了做到这一点,我使用ISearchIndexingHandler接口(下面的代码)创建了一个类。我正在索引项目的ContentText字段中的url,但是我不确定这通常是否包含页面的其他内容(我认为页面只有元数据,所以这应该没问题)。在自定义字段中使用此功能的优点是,我只需在搜索框中键入url,而无需使用< url> IN< fieldname>或类似的东西。

所以我的问题是,有没有理由不使用ContentText for Pages,使用自定义字段有什么优势吗?对于如何处理BluePrinting有很好想法的人也会获得奖励标记(如果我在父出版物中创建页面,我希望本地URL也在子出版物中编入索引),以及结构组路径被更改的情况(我想我可以以某种方式从我的索引处理程序中触发子页面项的重新索引)。

代码:

using System;
using Tridion.ContentManager.Search;
using Tridion.ContentManager.Search.Indexing.Handling;
using Tridion.ContentManager.Search.Indexing.Service;
using Tridion.ContentManager.Search.Indexing;
using Tridion.ContentManager.Search.Fields;

namespace ExampleSearchIndexHandler
{
    public class PageUrlHandler : ISearchIndexingHandler
    {
        public void Configure(SearchIndexingHandlerSettings settings)
        {               
        }

        public void ExtractIndexFields(IdentifiableObjectData subjectData, Item item, CoreServiceProxy serviceProxy)
        {
            PageData data = subjectData as PageData;
            if (data != null)
            {
                PublishLocationInfo info = data.LocationInfo as PublishLocationInfo;
                string url = GetUrlPrefix(data) + info.PublishLocationUrl;
                item.ContentText = url;
            }
        }

        private string GetUrlPrefix(PageData page)
        {
            //hardcoded for now, but will be read from publication metadata
            return "www.example.com";
        }
    }
}

2 个答案:

答案 0 :(得分:5)

您可以将网址存储在ContextText属性中。 Thies字段用于索引模板内容数据。

Tridion不会索引子出版物的共享项目。

在项目修改(创建,更新,删除,本地化和非本地化)上触发索引。 或者您可以使用重建索引工具重新索引您的项目。但是没有办法在子出版物中索引共享项目。

答案 1 :(得分:3)

我认为您不能在搜索查询中包含URL前缀作为索引项。由于共享项目未编入索引,因此您可能会从“网站结构”图层索引页面,该图层从未发布。

移动结构组时,您必须创建一个事件处理程序,该处理程序触发使用TOM.NET API的受保护方法重新索引所有子页面。此方法不是公共API的一部分,因此发布该解决方案的代码可能会声明我是R& D的不受欢迎的人:)

在重新索引任何内容之前,您应该将结构组的原始发布位置网址存储在TcmEventArgs.ContextVariables属性中,这样您就可以验证是否需要重新编制索引操作。