自定义网站搜索,以便根据其子项的内容返回父类型

时间:2014-01-16 05:38:57

标签: plone

我有一个灵活的内容类型,它是文件夹的,我希望它根据它的孩子的内容(pdfs等)显示在搜索结果中。这是可能的,在哪里以及如何实现?

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是重新索引子项的searchableText而不是项目本身(连接所有子项的searchableText)。

您的新搜索文本索引可能如下所示:

@indexer(IYourContainerType)
def SearchableText(obj):
    searchable_text = obj.SearchableText()

    for item in obj.getFolderContents({'portal_type': 'File'}, full_object=True):
        searchable_text += item.SearchableText()
    return searchable_text

现在您必须订阅一些事件,因为容器的SearchableText需要在容器中的更改时自动更新。

处理if:

  1. 将某些内容添加到Container
  2. 从容器中删除了一些东西
  3. 在容器
  4. 中修改了一些内容

    Docu for Events in Plone

    事件处理程序可能如下所示:

    def reindex_container(obj, event):
        parent = aq_parent(aq_inner(obj))
    
        if not IYourContainerType.providedBy(parent):
            return
    
        catalog = getToolByName(obj, 'portal_catalog')
        # Only reindex existing brains! The parent may be just
        # deleted, we should not put it back in the catalog.
        parent_path = '/'.join(parent.getPhysicalPath())
        if catalog.getrid(parent_path) is not None:
            parent.reindexObject()
    

    您可能需要单独处理MOVE