Zope3的持久化和基于会话的搜索表单
z3c.searcher的Python项目详细描述
详细文档
自述文件
这个包提供了一个持久的搜索查询实现。这个搜索 查询被实现为一个过滤器对象,它可以使用搜索条件来生成 搜索查询。这个包还提供了一些基于z3c.form的管理视图 它允许我们管理搜索过滤器和它的搜索条件。让我们 定义一个包含索引的站点,该索引允许我们为其建立搜索筛选器。
注意,这个包依赖于新的z3c.indexer包,它提供了 模块化索引概念。但你可以把这个包裹和 zope.app.catalog包也是。您只需建立我们自己的搜索城市。
开始一个简单的测试设置
设置一些助手:
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex
设置站点
< Buff行情>>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()
>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)
并将站点设置为当前站点。这通常是通过遍历到 地点:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)
设置iIntids实用程序:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)
文本索引
设置文本索引:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')
字段索引
设置字段索引:
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')
值索引
设置值索引:
< Buff行情>>>> from z3c.indexer.index import ValueIndex >>> valueIndex = ValueIndex() >>> sm['default']['valueIndex'] = valueIndex >>> sm.registerUtility(valueIndex, IIndex, name='valueIndex')
设置索引
设置集合索引:
< Buff行情>>>> from z3c.indexer.index import SetIndex >>> setIndex = SetIndex() >>> sm['default']['setIndex'] = setIndex >>> sm.registerUtility(setIndex, IIndex, name='setIndex')
演示内容
定义内容对象:
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex0
>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex1
>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex2
创建内容对象并将其添加到网站:
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex3
setitem的zope事件订阅者可以调用iIntids寄存器 方法。但我们没有设置相关的订户,所以 我们在这里执行此操作:
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex4
索引器
为内容对象设置索引器适配器。
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex5
将索引器适配器注册为命名适配器:
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex6
索引
在开始索引之前,我们检查索引:
< Buff行情>>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex7
>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex8
>>> import zope.component >>> from zope.site import folder >>> from zope.site import LocalSiteManager >>> from z3c.indexer.interfaces import IIndex9
>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()0
现在我们可以为演示对象编制索引:
< Buff行情>>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()1
检查我们的索引:
< Buff行情>>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()2
>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()3
>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()4
>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()5
搜索筛选器
现在我们已经准备好了,可以开始我们的搜索过滤器实现了。 以下搜索筛选器默认情况下不返回任何结果,因为它定义了 noterm作为getdefaultquery。如果你有大量的数据和 如果未选择citerium,则希望以空查询开始。
< Buff行情>>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()6
>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()7
>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()8
搜索标准
我们为演示内容定义了一个标准。此文本搜索准则使用 上面注册为 文本索引的文本索引:
< Buff行情>>>> class SiteStub(folder.Folder): ... """Sample site.""" >>> site = SiteStub()9
这样的标准可以在我们的索引中搜索。让我们从一个空的搜索查询开始:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)0
您可以看到searchquery返回一个空结果。
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)1
展示
现在我们可以创建一个criterium实例并给它们一个值:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)2
现在这个标准可以在给定的 给定(emtpy)搜索查询中的值。此空查询仅用作 可链接的查询对象。每个结果都从thi中添加或删除S链 取决于连接器 和 , 或 或 而不是 :
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)3
现在您可以看到,我们的标准从文本索引中找到了一个结果:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)4
>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)5
搜索标准工厂
上面的测试向您展示了criterium如何在索引中搜索。但那不是 所有。我们的概念提供了一个搜索过滤器,可以管理多个搜索 过滤器中的生物。criterium是过滤器的适配器。这意味着我们 需要创建适配器工厂并将此工厂注册为适配器 我们的过滤器。现在让我们创建这个criterium适配器工厂:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)6
此搜索标准工厂类实现ISearchCriteriumFactory:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)7
我们为内容搜索筛选器注册此适配器:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)8
展示
现在您可以看到我们的内容搜索过滤器知道搜索标准 工厂:
< Buff行情>>>> root['site'] = site >>> sm = LocalSiteManager(site) >>> site.setSiteManager(sm)9
因为搜索标准工厂是搜索过滤器的适配器,所以 工厂可以调整我们的ContentSearchFilter:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)0
现在我们可以打电话给工厂,我们将返回我们的搜索标准实例:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)1
我们的搜索标准提供了ISearchCriterium:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)2
搜索示例
现在我们准备在我们的过滤器构造中进行搜索。首先让我们创建一个 纯内容搜索筛选器:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)3
然后,让我们根据工厂名称添加一个标准:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)4
现在我们可以为标准设置一个值:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)5
并将标准添加到我们的过滤器中:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)6
仅此而已,现在我们的过滤器可以生成一个查询:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)7
示例搜索查询可以返回结果:
< Buff行情>>>> from zope.app.component import hooks >>> hooks.setSite(site)8
>>> from zope.app.component import hooks >>> hooks.setSite(site)9
搜索会话
在我们展示如何在z3c.form组件中使用criterium和filter之前, 我们将向您展示搜索会话的工作方式。让我们注册并创建 搜索会话:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)0
现在我们可以创建一个测试请求并将会话作为请求的适配器:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)1
搜索会话为存储和管理筛选器提供了一个api:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)2
我们可以从搜索会话中按名称获取此类筛选器。
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)3
或者我们可以在此会话中获取所有搜索筛选器:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)4
我们可以按名称删除筛选器:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)5
在search session方法中还有一个名为 key 的参数。 此参数可以用作命名空间。如果你需要支持 仅对一个对象实例进行筛选,可以使用该实例唯一的键 对象作为鉴别器。
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)6
只有使用右键 时,此类过滤器才可用:
< Buff行情>>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)7
>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)8
>>> from zope.intid import IntIds >>> from zope.intid.interfaces import IIntIds >>> intids = IntIds() >>> sm['default']['intids'] = intids >>> sm.registerUtility(intids, IIntIds)9
现在,让我们清理搜索会话并删除按以下键存储的筛选器:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')0
>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')1
标准格式
现在我们将向您展示表单部分是如何工作的。每个生物都可以渲染 在一个窗体内。我们提供了一个criteriumform类来完成这个任务。让我们 创建并呈现这样一个标准表单:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')2
我们还需要设置一个前缀,这通常由搜索表单通过 正在调用SetupCriteriumRows。正常情况下,标准是在搜索 过滤器。我们只需要一个CRITerium名称暂时:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')3
在呈现表单之前,我们需要注册模板:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')4
我们还需要z3c的一些小部件。表单:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')5
现在我们可以呈现criterium表单:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')6
过滤形式
还有一个过滤器表单可以表示searchfilter。这种形式 包括标准表单部分。注意我们使用了一个dumy上下文,因为它不是 与呈现此窗体的位置相关,因为窗体将获取筛选器 从会话中。
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')7
但是在使用表单之前,我们需要将搜索筛选器类设置为 工厂。因为只有这个搜索筛选器知道我们的条件:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')8
现在我们可以呈现过滤器窗体:
< Buff行情>>>> from z3c.indexer.index import TextIndex >>> textIndex = TextIndex() >>> sm['default']['textIndex'] = textIndex >>> sm.registerUtility(textIndex, IIndex, name='textIndex')9
搜索表单
还有一个搜索表单,允许您简单地定义一个搜索页面。 这个搜索表单使用criterium和filter表单,允许您简单地 创建搜索页。让我们定义一个自定义搜索页:
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')0
在使用表单之前,我们的请求需要提供表单ui层:
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')1
你只需要写一个简单的搜索表单。这个表单使用它自己的 内容搜索筛选器,并使用为此筛选器配置的条件。
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')2
搜索表
还有一个搜索表。这个搜索表使用criterium和filter 表单并允许您简单地创建一个搜索页,该页将列出结果 作为表。让我们定义一个自定义搜索表:
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')3
在使用表单之前,我们的请求需要提供表单ui层:
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')1
你只需要写一个简单的搜索表单。这个表单使用它自己的 内容搜索筛选器,并使用为此筛选器配置的条件。
< Buff行情>>>> from z3c.indexer.index import FieldIndex >>> fieldIndex = FieldIndex() >>> sm['default']['fieldIndex'] = fieldIndex >>> sm.registerUtility(fieldIndex, IIndex, name='fieldIndex')5
更改
0.6.0(2009-09-20)
- 错误修复:criterium在searchfilter中找不到正确的位置。标准 _ name始终是空的unicode值。
- 错误修正:criterim过滤器不能处理多个使用的criterium。 搜索表单现在定位筛选表单并设置单个前缀 对于标准形式。如果你使用自定义的criterium表单,你可能 必须检查您的自定义实现。特别检查前缀设置 在setupCriteriumRows方法中。
- 调整测试,反映最新的更改并修复元素属性顺序 在z3c.form中更改
0.5.2(2009-03-10)
- 清除依赖项。将包的邮件列表地址更改为 zope dev在zope.org而不是退休的。
0.5.1(2009-02-22)
- 修复:在z3c.searcher.table中添加了缺少的zope.interface导入,并添加了 SearchTable的测试
0.5.0(2009-02-22)
- 添加了初始代配置文件
- 初始版本