标题和描述未使用collective.dexteritytextindexer编制索引

时间:2011-09-19 11:22:50

标签: indexing plone dexterity

我有很多Dexterity内容类型,其中一些只是容器,只留下标题和描述(来自plone.app.dexterity.behaviors.metadata.IBasic行为)。

我可以通过搜索标题或说明中的文字找到它们。

但是对于一些复杂的内容类型我使用collective.dexteritytextindexer来索引更多字段并且工作正常,我可以在我标记为要编制索引的字段上找到该文本。

但标题和说明不再可用于搜索。我试过像:

class IMyContent(form.Schema):
    """My content type description
    """

    dexteritytextindexer.searchable('title')
    dexteritytextindexer.searchable('description')

    dexteritytextindexer.searchable('long_desc')
    form.widget(long_desc = WysiwygFieldWidget)
    long_desc = schema.Text (
            title = _(u"Rich description"),
            description = _(u"Complete description"),
            required = False,
        )
    ...

但我无法在portal_catalog中的SearchableText列中看到标题和说明的内容,因此结果不会显示它们。

知道我缺少什么吗?

干杯,

3 个答案:

答案 0 :(得分:5)

几乎有同样的问题。关于http://pypi.python.org/pypi/collective.dexteritytextindexer的文档,我使用了

from collective import dexteritytextindexer
from plone.autoform.interfaces import IFormFieldProvider
from plone.directives import form
from zope import schema
from zope.interface import alsoProvides

class IMyBehavior(form.Schema):

    dexteritytextindexer.searchable('specialfield')
    specialfield = schema.TextField(title=u'Special field')

alsoProvides(IMyBehavior, IFormFieldProvider)

将我自己的字段编入索引。但是,代码

from plone.app.dexterity.interfaces import IBasic
from collective.dexteritytextindexer.utils import searchable

searchable(IBasic, 'title')
searchable(IBasic, 'description')

没用。 IBasic的导入失败了。似乎可以通过导入

轻松解决
from plone.app.dexterity.behaviors.metadata import IBasic

答案 1 :(得分:4)

问题可能是该字段来自IBasic或IDublineCore行为,而不是来自您的架构。我不太了解collective.dexteritytextindexer知道如何解决这个问题。

另一种选择可能是使用plone.indexer并创建自己的SearchableText索引器,该索引器返回“%s%s%s”%(context.title,context.description,context.long_desc,)。有关详细信息,请参阅Dexterity文档。

答案 2 :(得分:1)

作为参考,这是我最后编写的代码:

@indexer(IMyDexterityType)
def searchableIndexer(context):
    transforms = getToolByName(context, 'portal_transforms')
    long_desc = context.long_desc // long_desc is a rich text field
    if long_desc is not None:
        long_desc = transforms.convert('html_to_text', long_desc).getData()
    contacts = context.contacts // contacts is also a rich text field
    if contacts is not None:
        contacts = transforms.convert('html_to_text', contacts).getData()

    return "%s %s %s %s" % (context.title, context.description, long_desc, contacts,)
grok.global_adapter(searchableIndexer, name="SearchableText")