如何查找字段的索引(如果有)

时间:2011-11-17 14:50:24

标签: plone

我在portal_catalog中有一些索引,适用于各种类型。

给定portal_type和fieldname,如何找到该字段的索引名称(如果有的话)?

关于zcatalog的文档的一些相关指针也可能对我有帮助!

谢谢..

2 个答案:

答案 0 :(得分:2)

没有简单的一对一方法来确定这一点。在Plone 4中,目录中的索引基本上有三种不同的方式可以从您的内容类型中获取信息。

索引配置

首先,可以选择使用要对给定对象进行索引的属性或方法的名称来配置索引。索引通常有getIndexSourceNames方法,可以告诉您它们将索引哪些项目。

通常这与索引ID相同,但这不是给定的。通常,如果您的字段访问者列在getIndexSourceNames的结果中,那么该索引将为给定类型的字段编制索引:

from Products.CMFCore.utils import getToolByName
catalog = getToolByName(context, 'portal_catalog')
for index in catalog.index_objects():
    if field.accessor in index.getIndexSourceNames():
         print 'Index %s indexes %s' % (index.getId(), field.getName()'

在上面的示例中,我假设您已经在变量field中保留了您的字段对象,并在变量context中包含您的类型的实际实例。

自定义索引适配器

当对象编入索引时,目录还会在对象周围构造一个包装器,并查找对象的索引适配器。这些适配器既为索引名称(因此getIndexSourceNames中列出的名称)和接口或类注册。如果您的内容类实现了该接口,或者具有直接为其类或基类注册的索引适配器,则可以使用索引适配器。

索引适配器是代码的任意代码段,因此可以调用内容对象上的任何字段来生成结果。没有编程方式可以确定是否使用您的内容类型的给定字段,或者是否将使用任何字段。

CMFPlone.CatalogTool module列出了索引适配器的几个示例,这些都是Interface注册的,意味着所有对象:

  • allowedRolesAndUsers收集有关您对象的安全信息。

  • getObjPositionInParent确定当前对象在其容器中的位置。因此,该索引器不需要来自对象本身的任何信息来确定它的值。

  • sortable_title获取您的内容Title值,并生成适合用于对目录搜索结果进行排序的值。它会对值进行标准化,对其进行小写,并使用前导零对数字进行前缀,以便更轻松地对编号标题进行排序。

直接方法访问

字段基本上是内容对象上生成的方法。但是你的内容类也可以在它的类上实现方法。与自定义索引适配器相同的注释适用于此处;这些是任意Python代码,因此他们可以使用您的内容类型字段,在将信息传递给索引之前聚合和修改信息。

Archetypes BaseObject类(在所有Archetypes内容类型中使用)定义了SearchableText method。此方法将searchable属性设置为True的所有可用字段,尝试将每个字段值作为纯文本,并聚合SearchableText索引的结果。

结论

您只能对与您的字段相关的索引内容进行有根据的猜测。通过内省索引配置,您将看不到是否有自定义索引器适配器屏蔽您的字段(注册getField索引适配器并且它将被使用而不是直接调用getField)。自定义索引器和类方法仍然可以访问您的字段并将信息传递给目录索引。

答案 1 :(得分:0)

您只需为要用于索引值的方法或属性名称添加一个索引 - 没有什么太棘手的事情,它可能都可以完成TTW

如果您需要更多逻辑来获取索引,请查看此stackoverflow问题:Problem with plone.indexer and Dexterity