3

我有很多敏捷内容类型,其中一些只是容器,只剩下标题和描述(来自 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 列上看不到title 和description 的内容,因此结果没有显示出来。

知道我错过了什么吗?

干杯,

4

3 回答 3

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
于 2012-09-27T12:06:03.167 回答
4

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

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

于 2011-09-19T12:39:58.210 回答
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")
于 2011-09-21T08:48:41.793 回答