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 IIndex
0
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
1
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
2

创建内容对象并将其添加到网站:

< Buff行情>
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
3

setitem的zope事件订阅者可以调用iIntids寄存器 方法。但我们没有设置相关的订户,所以 我们在这里执行此操作:

< Buff行情>
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
4

索引器

为内容对象设置索引器适配器。

< Buff行情>
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
5

将索引器适配器注册为命名适配器:

< Buff行情>
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
6

索引

在开始索引之前,我们检查索引:

< Buff行情>
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
7
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
8
>>> import zope.component
>>> from zope.site import folder
>>> from zope.site import LocalSiteManager
>>> from z3c.indexer.interfaces import IIndex
9
>>> 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)

  • 添加了初始代配置文件
  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java解析一个文本文件,如果内容是一种特定的格式,就打印它   java如何使jbutton在另一个组件中执行键盘笔划   连接到独立帐户的java Stripe   java在数据库连接过程中出错。。。初始连接   一个系列JavaFX中特定节点的java集样式   java重建recycler视图会导致它消失   在codechef上提交java Getting runtime(NZEC)时出错   Java类路径设置错误   java如何显示数组中2个数字之间的信息?   java为什么新的GC只有很长的用户时间?   如何解决java。关于此代码的lang.OutOfMemoryError   通过应用程序在Facebook粉丝页面上发布java帖子   java Red5服务器无法启动   系统输出Java读取文本文件外置行   java整数。Parse对excel获取的字符串抛出NumberFormatException   有一个Java数组列表;如何按每个数组的最后一个元素排序?   java需要txt文件中的数据(以逗号分隔)来用现有类中的对象填充arraylist