zope.catalog的高级查询系统
hurry.quer的Python项目详细描述
快速查询
===
zope.catalog的快速查询系统建立在其catalog
索引以及zc.catalog中的索引的基础上。它的部分灵感来自Dieter Maurer为Zope 2开发的AdvancedQuery,尽管它有一个独立的
来源。内容:
setup
----
让&;x27;定义一个简单的内容对象。首先是它的接口:来自zope的:
&;gt;&;gt;&;gt;接口导入接口、属性、实现者
&;gt;&;gt;类icontent(接口):
…f1=属性(&;x27;f1&;x27;)
…f2=属性(&;x27;f2&;x27;)
…f3=属性(&;x27;f3&;x27;)
…f4=属性(&;x27;f4&;x27;)
…T1=属性(&;x27;T1&;x27;)
…t2=属性(&;x27;t2&;x27;)
及其实现:从zope.container.contained import contained
&;gt;@functools.total\u ordering
…@实施者(icontent)
…类内容(包含):
…def u init(self,id,f1=&;x27;x27;x27;,f2=&;&;x27;x27;,f3=&;&;x27;x27;,f3=&;&;x27;x27;,f4=&;&;x27;x27;,t1=&;&;&;x27;x27;,t2=&;&;x27;,t1=&;&;&;&;&;x27;,t2=&;&;&;&;x27;,x27;,t2=&;&;&;&;&;x27;,x27;,t2;&;& 7;x27;):
…self.id=id
…self.f1=f1
…self.f2=f2
…self.f3=f3
…self.f4=f4
…自我。T1=T1
…self.t2=t2
…定义(自身,其他):
…返回self.id<;other.id
…定义公式(自身,其他):
…返回self.id==其他.id
…定义代表(自我):
…return&;x27;<;content";{}";gt;&;x27;.format(self.id)
id属性只是为了方便我们识别再次找到的对象。通过包含"cmp"方法,我们可以确保搜索结果
能够稳定地排序。
ope.intid.interfaces
&;gt;&;gt;@interface.implementer(zope.intid.interfaces.iIntid)
…dummyintid类(对象):
…标记=&;x27;&uu dummy_u int_uuu&;x27;
…定义初始化(自身):
…自计数器=0
…self.data={}
…定义寄存器(self,obj):
…intid=getattr(obj,self.marker,无)
…如果intid为none:
…setattr(obj,self.marker,self.counter)
…自我数据[自我计数器]=对象
…intid=self.计数器
…自计数器+=1
…返回intid
…def getid(self,obj):
…返回getattr(obj,self.marker)
…def getobject(self,intid):
…返回self.data[intid]
…定义(自我):
…从zope返回iter(self.data)
&;gt;&;gt;intid=dummyintid()
&;gt;&;gt;&;gt;>;组件导入provideutility
&;gt;&;gt;provideutility(intid,zope.intid.interfaces.iintid)
从zope.catalog.interfaces导入iCatalog
&;gt;&;gt;&;gt;从zope.catalog.catalog.catalog导入catalog
>;&;gt;catalog=catalog()
&;gt;&;gt;提供实用性(catalog,iCatalog,&;x27;catalog1&;x27;)
使用各种索引:
&;gt;&;gt;&;gt;from zope.catalog.field import fieldindex
&;gt;&;gt;&;gt;from zope.catalog.text import textindex
&;gt;&;gt;catalog[&;x27;f1&;&x27;]= FieldIndex('f1', IContent)
>>> catalog['f2'] = FieldIndex('f2', IContent)
>>> catalog['f3'] = FieldIndex('f3', IContent)
>>> catalog['f4'] = FieldIndex('f4', IContent)
>>> catalog['t1'] = TextIndex('t1', IContent)
>>> catalog['t2'] = TextIndex('t2', IContent)
now let&=3527 s create some objects so that they&=3527 ll be cataloged:
br/>br/>gt=>Content(1,&Amp&3527,&Amp&3527,&Amp&3527,&B&Amp&3527,&Amp&3527,&Amp&3527,),
Content(2,&&3527 a&&3527,c&&x27),
Content(3,&&3527&&3527;,&&3527;),br/..Content(4,&Amp&3527,&Amp&3527,&Amp&3527,&B&Amp&3527,&Amp&3527,&Amp&3527,),
Content(5,&&3527,&&3527,&&3527,&b&&3527,&&3527,&&3527),,
Content(6,&&3527,&&3527,&&x27&z&&3527)]
and catalog them now:
br/>br/>br/>br/>gt&Catalog.Index&U Doc(Intid.Register(Entry),entry)
now let&=3535;x27;s register a query utility:
br/>gt>gt&mp>gt;from hurry.query.query.query import query query
ampgtryempry inter普罗维登斯(Query)从Zope.component import getutility
gt>gt
gt>amphury>interport getutility
gt>amphury>from mpury gt>amphury>mphurymphury.DEF display query(q,context=none)页:1Query=Getutility(IQUERY)R=Query.Searchresults(Q,context)
return [e.id for e in sorted(list(r))]
FieldIndex Queries
------------------
We can query for all objects indexed in this index::
>>> from hurry.query import All
>>> f1 = ('catalog1', 'f1')
>>> displayQuery(All(f1))
[1, 2, 3, 4, 5, 6]
Now for a query where f1 equals a::
>>> from hurry.query import Eq
>>> f1 = ('catalog1', 'f1')
>>> displayQuery(Eq(f1, 'a'))
[1, 2, 4]
Not equals (this is more efficient than the generic ~ operator)::
>>> from hurry.query import NotEq
>>> displayQuery(NotEq(f1, 'a'))
[3, 5, 6]
Testing whether a field is in a set::
>>> from hurry.query import In
>>> displayQuery(In(f1, ['a', 'X']))
[1, 2, 3, 4, 5]
Whether documents are in a specified range::
>>> from hurry.query import Between
>>> displayQuery(Between(f1, 'X', 'Y'))
[3, 5, 6]
You can leave out one end of the range::
>>> displayQuery(Between(f1, 'X', None)) # 'X' < 'a'
[1, 2, 3, 4, 5, 6]
>>> displayQuery(Between(f1, None, 'X'))
[3, 5]
You can also use greater-equals and lesser-equals for the same purpose::
从Hurry.Query Import Ge,Le
gt&>du displayquery(GE(F1,Amp&3527 X27&Amp&3527);br/>[1,2,3,4,5,6]>br/>>;displayquery(le(f1,&;x27;x&;x27;)
[3,5]
it&;x27;也可能与~operator::
&;gt&;gt;amp;gt;gt;amp;gt;displayquery(~eq(f1,&;x27;a&;x27;&;x27;))
[3,5,6]
[3,5,5,6]
&;amp;):
&;gt&;gt&;gt;f2= ('catalog1', 'f2')
>>> displayQuery(Eq(f1, 'a') & Eq(f2, 'b'))
[1, 4]
Using or (|)::
>>> displayQuery(Eq(f1, 'a') | Eq(f2, 'b'))
[1, 2, 4, 5]
These can be chained::
>>> displayQuery(Eq(f1, 'a') & Eq(f2, 'b') & Between(f1, 'a', 'b'))
[1, 4]
>>> displayQuery(Eq(f1, 'a') | Eq(f1, 'X') | Eq(f2, 'b'))
[1, 2, 3, 4, 5]
And nested::
>>> displayQuery((Eq(f1, 'a') | Eq(f1, 'X')) & (Eq(f2, 'b&;x27;;eq(f2,&;x27;c&;x27;)
[1、2、3、3、4、5]
&;quot;和&;quot;以及&;quot;或&;quot;或&;quot;或&;也可以拼写不同的拼写:
&;gt;amp;gt;amp;gt;&;gt;或者
&;gt;amp;gt;amp;gt;displaqueryqueryqueryquery;displaqueryqueryqueryqueryquery;或者
&;gt;或者
&;gt;gt;或者
&;(和(方程式(F1,&;X27;A&AMx27;)、eq(f2,&;x27;b&;x27;)))
[1,4]
&;gt;&;gt;&;gt;gt;gt;显示查询(或(eq(f1,&;&;x27;a&;&;&;x27;))
[1,2,4,4,5]
[1,2,4,5]
<1,2,4,4,5]
<1,1,2,2,4,2,4,>in和&;amp;
的组合-
x27;in&;x2的组合7; and '&'::
>>> displayQuery(In(f1, ['a', 'X', 'Y', 'Z']))
[1, 2, 3, 4, 5, 6]
>>> displayQuery(In(f1, ['Z']))
[]
>>> displayQuery(In(f1, ['a', 'X', 'Y', 'Z']) & In(f1, ['Z']))
[]
SetIndex queries
----------------
The SetIndex is defined in zc.catalog.
&;gt;&;gt;&;gt;来自匆忙查询导入集
catalog.catalog.catalog.catalog的重要性导入。catalog<>>和catalog.gt>&.gt&;gt;&;gt;amp;gt;amp;gt;&;gt;gt;amp;gt;amp;gt;gt;gt;和gt;gt;catalog==catalog(((((((((((((((((((((((((((((((((())))>&&&&&&&&&;&&&;&&;>>>>>>>>>>>>>>> T T T T T T T T T T T T T T T amp;gt;&;gt;&;gt;来自zc.catal目录索引导入设置目录索引
&;gt;amp;gt;gt;catalog[&;x27;f1&;x27;]=setindex(&;x27;f1&;x27;x27;,icontent)
&;gt;gt;amp;gt;gt;catalog[&;x27;x27;x27;x27;x27;&;x27;]=fieldindex(&;x27;x27;x27;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;x27;&;x27;&;x27;&;&;&;&;gt;&;gt;gt;gt;7;,icontent)
A:
amp;gt;&;gt;&;gt;内容[
内容(1)[&35;x27;a&35;x27;,&;x27;b&35;x27;,&;35x27;c&35;x27;],
内容(2,[&35;x27;a&35;x27;],1),
内容(3,[&35;x27;b&35;x27;],1),
内容(4,[&35;x27;c&35;x27;,&35;x27;d&35;x27;],2),
内容(5,[&35;x27;b&35;x27;,&35;x27;c&35;x27;],2),
内容(6,[&35;x27;a&35;x27;,&35;x27;c&35;x27;],2),
内容(7,[&35;x27;z&35;x27;],2),
content(8)[,2][35没有值,因此没有索引。
目录索引文档(初始注册)(entry),entry)
我们可以查询所有索引对象:
&;gt;&;gt;displayquery(set.all(f1))
[1、2、3、4、5、6、7]
>> displayQuery(set.AnyOf(f1, ['a', 'c']))
[1, 2, 4, 5, 6]
>>> displayQuery(set.AnyOf(f1, ['c', 'b']))
[1, 3, 4, 5, 6]
>>> displayQuery(set.AnyOf(f1
[1,2,6]
>a&;x27;all&;x27;all&;&;x27;查询返回所有
>包含所有列出值的文档的所有文档:
&;gt;amp;gt;amp;gt;amp;gt;displayquery(set.all of(f1,[&;x27;a&;x27;x27;)))displayquery(set.allof(f1,[&;x27;a&;x27;x27;)))) [1,2,6]
&;gt;&;gt;&;gt;displayquery(set.allof(f1,[&;x27;a&;x27;&;x27;b&;x27;&;x27;&;x27;&;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;&;x27;&;x27;&;x27;&;x27;c&;&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;x27;)))
[1,6]
下一组有趣的查询允许您对
值进行求值例如,您可以要求在一组特定值之间的所有对象:
>displayquery(set.setbeetween(f1,&;&;&;&;x27;x27;&;&;x27;&;x27;&;&;x27;&;&;x27;&;&;x27;)
[1、2、3、3、4、4、5、5、6]
&;gt;&;gt;amp;gt;amp;gt;&;gt;gt;displayquery(set.setbeetbeetweetweetweetweetween(set.setsetsetsetsetbeetbeetweetweetweetween(f1,&;(一层,&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;&;&;&;&;&;&;&;&;x27;&;&;&;x27;c&;&;x27;c&;&;&;x27;&;&;x27;&;&;x27;c&;&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;&;&;>[1,3,5]
&;gt;&;gt;>;显示查询(设置中间点(f1,&;#x27;a&;x27;,&;x27;c&;x27;,
…排除_min=true,排除_max=true))
[1,3,5]
&;gt;amp;gt;amp;gt;displayquery(set.setbetween(f1,&;x27;c&;x27;x27;x27;;x27;x27;;x27;;x27;x27;;x27;;none))
[1,4,5,5,6,7]
>amp;gt;amp;gt;gt;amp;gt;gt;gt;displayquery;displayquery(set.setbetweetweetween(f1,none,&setbetween,上午x27;c&;x27;,exclude&max=true))
[1,2,3,5,5,6]
>您可以链式设置查询:
&;gt;amp;gt;gt;displayquery;displayquery;displayquery(set.anyof(f1,[&;x27;a&;x27;])&;amp;eq(f2,1))
[1,2]
还支持"zc.catalog"扩展数据块。第一个查询是
``extentany``,它返回与该范围匹配的所有数据。如果
区段是"none",则返回所有文档ID:
&;gt;&;gt;displayquery(set.extentany(f1,none))
[1、2、3、4、5、6、7]
从zc.catalog.extentCatalog import filterextent
&;gt;&;gt;extent=filterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(4)中的i:
…extent.add(i,i)
然后只返回前四个:displayquery(set.extentany(f1,extent))
[1,2,3,4]
a mp;gt;gt;amp;gt;amp;gt;id=IntID.register(content(9,&;x27;b&;x27;))
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;id=IntID.register(content(10,&;&;x27;c&;&;x27;))
&;gt;amp;gt;amp;gt;gt;id=IntID.register(content(11,&;x27;a&;x27;a&;x27;&;x27;)))
&;gt;gt;gt;amp;gt;gt;gt;id=IntID=IntID.register.register.regist7;)
&a mp;gt;&;gt;范围=FIalterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(11)中的i:
…extent.add(i,i)
&;gt;&;gt;&;gt;displayquery(set.extentnone(f1,extent))
[8,9,10,11]
valueindex查询
---------
标准字段索引的n
。
&;gt;&;gt;&;gt;from hurry.query import value
让&;x27;设置使用此索引的目录。"`valueindex``在
``zc.catalog``中定义。让&;x27;s制作一个使用它的目录:
&;gt;&;gt;&;gt;intid=dummyintid()
&;gt;&;gt;提供功能(intid,zope.intid.interfaces.iintid)
&;gt;&;gt;&;gt;从zope.catalog.interfaces导入icatalog
&;gt;&;gt;from zope.catalog.catalog import catalog
&;gt;&;gt;catalog=catalog()
&;gt;&;gt;&;gt;provideutility(catalog,icatalog,&;x27;catalog1&;x27;)
&;gt;&;gt;from zc.catalog.catalogindex import valueindex
&;gt;&;gt;目录[&;x27;f1&;x27;]=valueindex(&;x27;f1&;x27;,icontent)
内容(1,&;x27;a&;x27;),
…内容(2,&;x27;b&;x27;),
…内容(3,&;x27;c&;x27;),
…内容(4,&;x27;d&;x27;),
…内容(5,&;x27;c&;x27;),
…内容(6,&;x27;a&;x27;)]
index.index_doc(intid.register(entry,entry),entry)
>我们查询所有索引对象:
&;gt;amp;gt;gt;gt;gt;f1=(&;x27;Catalog1&;x27;&;&;x27;f1&;&;x27;)
&;gt;amp;gt;gt;displayquery(value.all(f1))
[1,2,3,4,5,5,6]
1,2,3,3,4,4,5,5,5,6]
<1,1,2,2,3,3,3,3,3,3,/>
现在就让&;x27;s搜索所有"f1``f1``等于&;x27;a&;x27;
&;gt;amp;gt;amp;amp;gt;amp;gt;gt;gt;f1=(&;x27;Catalog1&;x27;&;x27;&;x27;f1&;x27;)
&;gt;amp;gt;gt;amp;gt;gt;x27;显示查询(value.eq(f1,&;x27;a&;&;x27;a&;&;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;gt;gt;f1;&;x27;&;&;x27;&;&;&;x27;&(x27;)
[1,6]
其中"f1"不等于&;x27;a&;x27;;这比一般的"x27"运算符更有效:
&;gt;>;displayquery(value.noteq(f1,&;x27;a&;x27;))
[2,3,4,5]
ery
不会崩溃。
&;gt;&;gt;&;gt;displayquery(value.noteq(f1,&;x27;z&;x27;))
[1、2、3、4、5、6]
[&下一组有趣的查询允许您对
值进行评估。例如,您可以要求在一组特定的
>值之间的所有对象:
&;gt;gt;amp;gt;gt;displayquery(value.betwe介于(f1,&;x27;a&;x27;&;&;x27;&;&;x27;&;&;x27;&;&;&;x27;)&br/>[1、2、3、3、5、5、6]
&;gt;gt;amp;gt;gt;displayquery(value.bet介于(f1,&;&;&;&;gt;gt;之间)displayquery 35x27;A和X27;&;x27;c&;x27;,exclude_min=true))
[2,3,5]
&;gt;amp;gt;amp;gt;gt;displayquery(value.between(f1,&;x27;a&;x27;&;x27;&;x27;&;x27;&;&;x27;c&;x27;c&;x27;&;x27;&;c&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;,x27;x27 amp;gt;&;gt;&;gt;显示查询(值。介于(f1,&;x27;a&;x27;,&;x27;C&;x27;,
…exclude-min=true,exclude-max=true)
[2]
>您还可以忽略范围的一端:
>displayquery(value.between.between.between(f1,&;&;x27;c&;x27;c&;x27;c&;x27;c&;x27;c&;x27;c&;x27;c&;x27;x27;c&;x27;x27;x27;c&;x27;x27;c&;x27;x27;x27;c&;x27是的#
[1,2,3,5,5,6]
>您也可以使用大于等于和小于等于等于来达到相同的目的:
&;gt;gt;amp;gt;gt;displayquery(value.ge(f1,&;&;x27;c&;&;x27;)
[3,4,5]
&;gt;gt;gt;&;gt;gt;
[3,4,5]
&;gt;gt;gt;gt;displayquery(value.le(f1,&;&;x27;c&;&;&;&;&;&;&;&;x27;)
[ 1, 2, 3,5,6]
您可以链接值查询:
&;gt;&;gt;displayquery(value.ge(f1,&;x27;c&;x27;)&;value.le(f1,&;x27;c&;x27;)
[3,5]
"value"模块还支持"zc.catalog"范围。第一个查询是
``extentany``,它返回与该范围匹配的所有数据。如果
范围是"none",则返回所有文档ID:
&;gt;&;gt;displayquery(value.extentany(f1,none))
[1、2、3、4、5、6]
rom zc.catalog.extentCatalog import filterextent
&;gt;&;gt;extent=filterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(4)中的i:
…extent.add(i,i)
然后只返回前四个:displayquery(value.extentany(f1,extent))
[1,2,3,4]
&;gt;amp;gt;amp;amp;gt;id=IntID.register(content(7,&;x27;b&;x27;))
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;id=IntID.register(content(8,&;&;x27;c&;&;x27;))
&;gt;amp;gt;amp;gt;gt;id=IntID.register(content(9,&;x27;a&;x27;a&;x27;))
&;gt;gt;id=IntID=IntID.register.register(content(content(9,&;9,&;x27;7;)
&;gt;&;gt;范围=FIalterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(9)中的i:
…扩展。添加(i,i)displayquery(value.extentnone(f1,extent))
[7,8,9]
此上下文确定要搜索的索引。
导入zope.component.interface
&;gt;&;gt;&;gt;导入zope.interface
&;gt;&;gt;intid1=dummyintid()
&;gt;&;gt;@zope.interface.implementer(zope.component.interfaces.icomponentlookup)
…类mocksite(对象):
…定义初始化(自身):
…self.registry=组件(&;x27;组件&;x27;)
…def queryutility(self,interface,name=&;x27;&;x27;,default=none):
…如果name==&;x27;&;x27;:返回intid1
…否则:返回目录2
…def getsitemanager(self):
…自zope.component.hooks导入网站设置站点(site1=mocksite)
&;gt;gt;amp;gt;gt;amp;gt;gt;amp;gt;amp;gt;amp;gt;br/>&;gt;gt;amp;gt;amp;gt;amp;gt;gt;设置站点(site1)
&;gt;gt;amp;gt;amp;gt;gt;Catalo2[&;x27;f1&;x27;&;x27;&;x27;&;amp;gt;gt;amp;gt;gt;gt;amp;gt;gt;amp;gt;gt;gt;gt;amp;gt;gt;gt;gt;gt;2;Catalo2[&;&;x27;x27;内容)
&;gt;&;gt;&;gt;内容=[
…内容(1,&;x27;a&;x27;),
…内容(2,&;x27;b&;x27;),]
&;gt;&;gt;&;gt;对于内容中的条目:
…目录2.索引文档(intid1.注册(entry),entry)
&;gt;>;displayquery(在(f1,[&;x27;a&;x27;,&;x27;b&;x27;]),context=site1)
[1,2]
&;gt;&;gt;&;gt;catalog=catalog()
&;gt;&;gt;&;gt;提供实用性(catalog,icatalog,&;x27;catalog1&;x27;)
&;gt;gt;> catalog['f1'] = FieldIndex('f1', IContent)
>>> catalog['f2'] = FieldIndex('f2', IContent)
>>> catalog['t'] = TextIndex('t1',i内容)
first let&;x27;s设置一些新数据:
&;gt;&;gt;content=[
…内容(1,&;x27;a&;x27;,2,t1=&;x27;美丽胜于丑陋。&;x27;),
…内容(2,&;x27;a&;x27;,3,t1=&;x27;显式优于隐式,
…内容(3,&;x27;b&;x27;,9,t1=&;x27;简单优于复杂的&;x27;),
…内容(4,&;x27;c&;x27;,8,t1=&;x27;复杂优于复杂的&;x27;),
…内容(5,&;x27;c&;x27;,7,t1=&;x27;可读性计数&;x27;),
…内容(6,&;x27;a&;x27;,1,t1=&;x27;虽然实用性胜过纯粹性&;x27;)]
,现在就对它们进行分类:
&;gt>catalog.index_doc(intid.register(entry),entry)
query=getutility(iquery)
…r=query.searchresults(q,context,**kw)
…返回[e for e in r]
如果不在查询本身中使用排序,则结果集具有未定义的
顺序。&;quot;手动&;quot;将结果排序到此处以使可测试的结果具有可测试的结果。
&;gt;amp;gt;gt;f1=(&;&;x27;Catalog1&;&;x27;&;x27;f1&;x27;)
&;gt;&;gt;&;gt;&;gt;&;gt;[r for r in sor排序(displaresult(displaresult,eq(f1,&;&;x27;a&;x27;x27;x27;&;x27;x27;&;x27;&;x27;&;gt;gt;gt;gt;f1;&;f1=))]
[<;内容&&;amp;amp;amp;amp;amp;amp;lt;content&;2&;amp;amp;gt;&;lt;content&;6&;amp;amp;gt;]
>现在,我们对f2索引进行排序。现在,我们对f2索引进行排序。现在,我们对f2索引进行排序。
&;gt;amp;gt;amp;gt;gt;f1=&;&;x27;&;&;x27;f1&;&;&;x27;f1&;&;&;&;x27;&;x27;&;&;&;&;&;x27;&;&;&;x27;&;& x27;)
&;gt;&;gt;&;gt;显示(F1,&;x27;A&;x27;),排序字段=(&;x27;Catalog1&;x27;&;x27;x27;&;x27;&;x27;))
[&;lt;content&;quot;6&;amp;amp;gt;&;lt;content&;1&;amp;quot;&;gt;&;lt;content&;lt;content&;content&&;quot;&;lt;content&;content&;quot;&;content&&&;content&&&&&&&;gt;、&;lt;content&;content&&&&&&&&;"2";&;gt;]
颠倒顺序。
&;gt;>> f1 = ('catalog1', 'f1')
>>> displayResult(Eq(f1, 'a'), sort_field=('catalog1', 'f2'), reverse=True)
[<Content "2">, <Conte&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;]
>我们可以限制找到的物品的数量。我们可以限制找到的物品的数量。我们可以限制找到的物品的数量。显示结果(公式(f1,&;x27;a&;x27;), sort_field=('catalog1', 'f2'), limit=2)
[<Content "6">, <Content "1">]
>>> f1 = ('catalog1', 'f1')
>>&;gt;显示结果(eq(f1,&;x27;a&;x27;)、排序字段=(&;x27;Catalog1&;x27;&;x27;x27;&;x27;Catalog1&;x27;&;x27;&;x27;)、限制=2,开始=1)
[&;lt;content&;lt;content&;quot;1&;amp;gt;、&;lt;content&;quot;2&;amp;gt;&;gt;&;gt;&;lt;content&;2&;2&;2&;amp;amp;amp;gt;gt;&;gt;&;gt;gt]
我们也可以限制反向结果集。
&;gt;&;gt;&;gt;f1=(&;x27;目录1&;x27;,&;x27;f1&;x27;)
&;gt;&;gt;显示结果(
…eq(f1,&;x27;a&;x27;),排序字段=(&;x27;目录1&;x27;,&;x27;f2&;x27;),限制=2,反向=真)
&;amp;amp;amp;amp;amp;amp;amp;lt;content&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp显示结果(公式(f1,&;)#x27;a&;x27;,sort\field=catalog&;x27;x27;x27;x27;)
[&;lt;content&;quot;6&;quot;amp;gt;&;lt;content&;quot;1&;quot;amp;amp;gt;&;lt;content&;content&;quot;2&;quot;2&;quot;gt;]
>无论何时使用不支持的字段进行排序,只要使用不支持的字段进行排序,都会出现错误,无论何时使用不支持的字段进行不支持的排序,只要使用不支持的字段进行排序,只要使用不支持的字段进行排序,只要使用不支持的字段进行排序,则错误br/>raised.
>>> f1 = ('catalog1', 'f1')
>>> displayResult(Eq(f1, 'a'), sort_field=('catalog1', 't'))
Traceback (most recent call last):
...
值错误:目录目录1中的索引t不支持排序。
在本测试中,假设
>测试索引的自然顺序具有足够的确定性,足以用作适当测试。
&;gt;gt;amp;gt;gt;f1=(&;x27;Catalog1&;x27;&;x27;f1&;x27;
&;gt;&;gt;gt;显示结果(eq(f1,&;x27;a&;x27;&;x27;)显示结果(eq(f1,&f1,&;x27;a&;x27;&;x27;))的自然顺序具有足够的确定性,足以用作适当测试。
<
&;gt;gt我是说,限制=2)
,&;lt;content&;quot;1&;amp;amp;gt;&;lt;content&;quot;2&;quot;amp;gt;]
&;gt;amp;amp;gt;f1=&;x27;Catalog1&;x27;&;x27;&;&;x27;&;&;x27;&;&;x27;
&;gt;&;lt;lt;content&;gt;2&;amp;amp;amp;gt;&;amp;gt;&;gt;&;gt;
;br/>&;amp;gt;amp;amp;gt;gt均衡器(f1,&;x27;a&;x27;,开始=1)
[&;amp;lt;content&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;amp;amp;amp;amp;amp;amp;amp;gt;
;br/>;amp;amp;gt;amp;amp;amp;amp;gt;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;amp;gt;gt;gt;f1;&;amp;amp 35x27;a&;x27;,开始=1,限制=1)
[<;
&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;f1=(&;x27;Catalog1&;x27;&;x27;&;&;x27;&;x27;)
&;gt;&;amp;gt;amp;gt;&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;
&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;&;2;amp;gt;gt;&;gt;&;gt;&;gt;gt;/>[<;内容";6";>;,<;继续tent";2";gt;]
结果计数器
----
>结果对象提供有关结果的元数据。
query=getutility(iquery)
…return query.searchresults(q,context,**kw)
>使用排序字段执行查询会给出定义良好的结果:
&;gt&;gt;gt;gt;f1=(&;&;x27;Catalog1&;x27;&;&;x27;&;&;&;x27;)
&;gt;gt;gt;result=getresult(eq(f1,&;&;x27;a&&;x27;&;a&;&;amp;amp;gt;gt;gt;gt;gt;gt;f1;&;f1;&;x27;&;&;&;,所以对于e-in-result,
>&;gt;&;gt;&;gt;[e-e-in-result]
[&;lt;content&;quot;1&;amp;gt;gt;&;lt;content&;quot;2&;quot;amp;gt;&;lt;content&;content&;6&;content&;gt;]
我们可以访问&;&;我们可以访问&;&;amp;gt;6&;quot;gt;&;gt;]
我们可以访问&;&;我们可以访问&;&;&;我们可以访问&;&;我们可以35x27;总计&;x27;和&;#x27;统计&;x27;属性和&;x27;first()&;&;x27;first;&;&;&;x27;对结果:
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;结果。总计
3
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;x27;属性和&;&;x27;first;&;&;x27;first;&;&;&;x27;first;&;&;&;x27;对结果:结果:结果:结果:总计
>3
>3
&/>
查在返回的数据中会反映出返回的数据:
&;gt;amp;gt;gt;result=getresult(eq(f1,&;&;x27;a&;x27;)、sort(sort)field=catalog[&;x27;f1&;x27;,start=1)
&;gt;&;gt;&;gt;对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-result,对于e-in[<;内容";2";&;gt;,<;内容";6";gt;]
它还会更改&;x27;计数&;x27以及&;x27;first()&;&;x27;
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;lt;result;result.result.count
2
&;gt;amp;gt;amp;gt;result.first()
&;lt;content&;quot;2&;amp;quot;amp;gt;
>但&;x27;total&;&;x27;仍然反映所有匹配项,包括隐藏的第一个匹配项在内的所有匹配项仍然反映所有匹配项,包括隐藏的第一个匹配项:
br/>br/>>
&;gt;&;gt;&;gt;结果。总计
3
添加限制:
&;gt;&;gt;result=getresult(eq(f1,&;x27;a&;x27;),sort_field=catalog[&;x27;f1&;x27;],start=1,
…限制=1)
&;gt;amp;gt;amp;gt;gt;[e for e in result]
[&;lt;content&;quot;2&;quot;amp;gt;]
&;gt;amp;gt;amp;amp;gt;结果。总
>3
3
&;gt;amp;gt;amp;gt;amp;gt;结果。计数
1
&;gt;amp;gt;amp;gt;amp;amp;gt;amp;gt;&;gt;&;gt;&;gt;&;gt;&;gt;e for e in result;e in result;
&;lt;lt;内容&;2&&;gt;
可用于空结果:
&;gt;amp;gt;gt;result=getresult(eq(f1,&;x27;foo&&;x27;)、sort\field=catalog[&;x27;f1&;x27;))
&;gt;gt;amp;gt;gt;[e for e-in-result]
>
>
&;gt;amp;gt;amp;gt;amp;gt;result;result;result;result;result;total
0
>0
0
<
&;gt;gt;gt;gt/>&;gt;&;gt;&;gt;结果。计数
0
&;gt;&;gt;result.first()为none
true
wrapper
----
定义初始化(自身,父级):
…self.parent=父项
…定义代表(自我):
…return '<Wrapper "{}">'.format(self.parent.id)
>>> f1 = ('catalog1', 'f1')
>>> displayResult(Eq(f1, 'a'), wrapper=Wrapper)
[<Wrapper "1">, <Wrapper";2";gt;,<;wrapper";6";gt;]
query=getutility(iquery)
…r=query.searchresults(q,context,**kw)
…return [(e.__parent__, e) or None for e in r]
>>> f1 = ('catalog1', 'f1')
>>> displayParent(Eq(f1, 'a'), limit=2)
[(None, <Content "1">), (None, <Content "2">)]
&;gt;amp;gt;amp;amp;gt;parent=content(&;x27;parent&;x27;)
&;gt;amp;gt;amp;gt;amp;gt;gt;displaparparparparparent(eq(f1,&;x27;a&;x27;)&;gt;gt;amp;gt;gt;displaparparparparparparparparparent,eq(f1,&;x27;a&;x27;),limit=2,loc定位到=parparparent)
(&;lt;content&;gt;parent&;amp;gt;&;gt;&;lt;content&;1&;amp;1&;amp;amp(&;lt;内容";父级";&;gt;,&;lt;c)&;quot;2&;quot;amp;gt;)]
>这可以与包装一起使用:
&;gt;gt;amp;gt;gt;displayparparent(eq(f1,&;x27;a&;x27;,limit=2,wrapper=wrapper,locate_to=parent)
[(&;lt;content&;quot;parent&;quot;parent&;gt;、&;lt;wrapper&;1&;1&;1&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;gt;gt;gt;gt;gt quot;>;),(<;内容";父级&aamp;amp;amp;amp;lt;wrapper&;amp;quot;2&;amp;amp;gt;gt;)]
>>
&;gt;amp;gt;amp;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;x27;T&;x27;)
>;&;gt;gt;显示结果(文本(T1,&;x27;更好&;x27;))
[&;lt;内容";1";gt;,&;lt;内容";2";gt;,&;lt;内容";3";gt;,&;lt;内容";4";gt;]
无效文本查询返回空结果::
&;gt;>;显示结果(文本(T1,&;x27;?*&;x27;)
[]
其他术语
----
您可以进行差异处理,这里包含更好但确实
的所有项都有一个作为f1的项:
&;gt;&;gt;&;gt;来自匆忙的。查询导入差异
&;gt;&;gt;显示结果(差异(文本(T1,&;x27;Better&;x27;,eq(f1,&;x27;a&;x27;))
[&;lt;content&;quot;3&;quot;gt;&;lt;content&;quot;4&;quot;&;quot;&;gt;]
有一个特殊术语允许将对象与目录
查询混合使用::
&;gt;&;gt;>br/>amp;gt;&;gt;来自HURry.查询导入对象
>;amp;gt;>;显示结果(对象(内容))
[&;lt;内容";1";amp;gt;,&;lt;内容";2";amp;gt;,&;lt;内容";3";gt;,&;lt;内容";4";amp;gt;,&;lt;内容&;quot;5";gt;,<;content";6";gt;]
gt;gt;all-intids=[intid.getid(x)for x in content]
&;gt;&;gt;displayResult(ids(*all-intids))
[&;lt;content";1&;quot;,&;lt;content";2&;quot;,<;content";3";,&;lt;content";4&;quot;gt;,<;content";5";gt;,&;lt;content";6";gt;]
&;gt;&;gt;奇数输入=[如果x.id为%2,则内容中x的输入.getid(x)]
>
>变化
====
===
>
>3.1(2018-08-08-08)3.1(2018-08-08)3.1(2018-08-08)3.1(2018-08-08-08)3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0(2018-01-1)9)
----
-除了python 2.7之外,还支持python 3.4、3.5和3.6
-准备python3的清理支持:
错误修复:
o api更改:修复和(加权=)关键字参数输入错误
o api更改:删除完全断开的"include_minimum"and``include_maximum`
setbetween()的参数,改为提供``exclude_min``和``exclude_max``参数。
o api change:fix breaked setbetween.apply():introduct``cache``arg
o fix extentnone()super delegation bug
o fix timingawarecaching.report()edge condition bug
主要:
o删除不支持的事务缓存
次要:
o澄清快速查询环境和搜索结果(计时=)类型
o修复计时缓存。report()输出类型
o澄清查询。searchresults(缓存=)参数类型
o删除无法访问的代码path from and()
dev:
o最大化测试覆盖率
o添加travis和tox测试配置
o绕过引导程序。py
o各种python3兼容性准备
2.6(2018-01-10)
----
-更新依赖项以不依赖zodb3 anymore.
2.5(2017-07-17)
----
-`sort戋field`可以是索引名或提供'iIndexSort'本身的对象。
-`searchResults()`接受可选参数'locate戋to'和'wrapper'。
"locate_to"用作放置在
结果对象周围的位置代理的"父级"。"wrapper"是一个可调用的回调函数,它应该为其参数接受一个参数。
2.4(2017-06-22)
----
-don&;x27;不抛出类型错误切片未排序的结果,修复了.3(2017-04-26)
————————————————————————————————————————————————————————————————————————————————————————————————————————————————调用方可能仍然希望得到类似
对象的结果。
2.2(2017-04-26)
----
-搜索结果的缓存选项现在接受类似于dict的值,它将使用该值允许在多个searchresults()
调用上缓存结果。缓存失效则由调用者负责。
2.1(2017-02-07)
----
-添加查询所需时间的可能性。可以使用"searchresults"的新"timing"选项或环境变量"hush-query-timing"对其进行控制。
2.0.1(2016-09-08)
----
--修复文本项中的日志行以进行无效文本搜索。
2.0(2016-09-07)
-
-添加新术语:差异。它在作为参数传递的第一个和
以下术语之间起作用。
-添加新术语:objects。它从参数中传递的对象中创建一个结果。它允许您将实际对象与现有的目录
查询(例如,与、或或差异)混合使用。
-向searchresult添加一个选项start以跳过
结果集中的第一个结果。
-扩展searchresult的结果。您有关于结果的附加信息
,包括没有
开始/限制限制的结果总数。名为first()的方法只返回
第一个结果(如果可用)或不返回。
-向searchresult添加一个选项缓存,以缓存zope事务中每个
项的结果,从而加快类似的查询。如果禁用
,则术语仍将缓存在同一个查询中。
1.2(2015-12-16)
----
*添加对all查询的支持。
1.1.1(2012-06-22)
----
*extentnone in set.py缺少一个参数"index\u id"。感谢danilo
botelho提供的错误报告。
1.1.0(2010-07-12)
----
*允许查询的searchresults方法获取一个额外的关键字
参数"sort\u field",该参数定义了要排序的(目录名、索引名)。该目录中的索引应实现iIndexSort。
除此关键字参数外,还可以传递"limit"和"reverse"关键字参数,这将限制排序结果集和/或反转其
顺序。
*允许查询对象的SearchResults方法获取额外的
可选上下文参数。此上下文将确定对哪个目录执行搜索。
1.0.0(2009-11-30)
----
*刷新依赖项。使用zope.catalog和zope.intid,而不是分别使用zope.app.catalog和zope.app.intid。don&;x27;t zope.app.zapi.
*使包描述更加现代化。
*清理代码样式。
0.9.3(2008-09-29)
----
*错误:当索引中的所有值都满足noteq条件时,noteq查询不再失败。
0.9.2(2006-09-22)
---------
*芝士店的第一个版本。
0.9.1(2006-06-16)
---------
*使zc.catalog成为"快速查询"的依赖项。
0.9(2006-05-16)
----
*将"快速查询"与其他"快速查询"软件包分开。蛋化工作。
*支持zc.catalog中的valueindex。
>0.8(2006-05-01)
————
===
zope.catalog的快速查询系统建立在其catalog
索引以及zc.catalog中的索引的基础上。它的部分灵感来自Dieter Maurer为Zope 2开发的AdvancedQuery,尽管它有一个独立的
来源。内容:
setup
----
让&;x27;定义一个简单的内容对象。首先是它的接口:来自zope的:
&;gt;&;gt;&;gt;接口导入接口、属性、实现者
&;gt;&;gt;类icontent(接口):
…f1=属性(&;x27;f1&;x27;)
…f2=属性(&;x27;f2&;x27;)
…f3=属性(&;x27;f3&;x27;)
…f4=属性(&;x27;f4&;x27;)
…T1=属性(&;x27;T1&;x27;)
…t2=属性(&;x27;t2&;x27;)
及其实现:从zope.container.contained import contained
&;gt;@functools.total\u ordering
…@实施者(icontent)
…类内容(包含):
…def u init(self,id,f1=&;x27;x27;x27;,f2=&;&;x27;x27;,f3=&;&;x27;x27;,f3=&;&;x27;x27;,f4=&;&;x27;x27;,t1=&;&;&;x27;x27;,t2=&;&;x27;,t1=&;&;&;&;&;x27;,t2=&;&;&;&;x27;,x27;,t2=&;&;&;&;&;x27;,x27;,t2;&;& 7;x27;):
…self.id=id
…self.f1=f1
…self.f2=f2
…self.f3=f3
…self.f4=f4
…自我。T1=T1
…self.t2=t2
…定义(自身,其他):
…返回self.id<;other.id
…定义公式(自身,其他):
…返回self.id==其他.id
…定义代表(自我):
…return&;x27;<;content";{}";gt;&;x27;.format(self.id)
id属性只是为了方便我们识别再次找到的对象。通过包含"cmp"方法,我们可以确保搜索结果
能够稳定地排序。
ope.intid.interfaces
&;gt;&;gt;@interface.implementer(zope.intid.interfaces.iIntid)
…dummyintid类(对象):
…标记=&;x27;&uu dummy_u int_uuu&;x27;
…定义初始化(自身):
…自计数器=0
…self.data={}
…定义寄存器(self,obj):
…intid=getattr(obj,self.marker,无)
…如果intid为none:
…setattr(obj,self.marker,self.counter)
…自我数据[自我计数器]=对象
…intid=self.计数器
…自计数器+=1
…返回intid
…def getid(self,obj):
…返回getattr(obj,self.marker)
…def getobject(self,intid):
…返回self.data[intid]
…定义(自我):
…从zope返回iter(self.data)
&;gt;&;gt;intid=dummyintid()
&;gt;&;gt;&;gt;>;组件导入provideutility
&;gt;&;gt;provideutility(intid,zope.intid.interfaces.iintid)
从zope.catalog.interfaces导入iCatalog
&;gt;&;gt;&;gt;从zope.catalog.catalog.catalog导入catalog
>;&;gt;catalog=catalog()
&;gt;&;gt;提供实用性(catalog,iCatalog,&;x27;catalog1&;x27;)
使用各种索引:
&;gt;&;gt;&;gt;from zope.catalog.field import fieldindex
&;gt;&;gt;&;gt;from zope.catalog.text import textindex
&;gt;&;gt;catalog[&;x27;f1&;&x27;]= FieldIndex('f1', IContent)
>>> catalog['f2'] = FieldIndex('f2', IContent)
>>> catalog['f3'] = FieldIndex('f3', IContent)
>>> catalog['f4'] = FieldIndex('f4', IContent)
>>> catalog['t1'] = TextIndex('t1', IContent)
>>> catalog['t2'] = TextIndex('t2', IContent)
now let&=3527 s create some objects so that they&=3527 ll be cataloged:
br/>br/>gt=>Content(1,&Amp&3527,&Amp&3527,&Amp&3527,&B&Amp&3527,&Amp&3527,&Amp&3527,),
Content(2,&&3527 a&&3527,c&&x27),
Content(3,&&3527&&3527;,&&3527;),br/..Content(4,&Amp&3527,&Amp&3527,&Amp&3527,&B&Amp&3527,&Amp&3527,&Amp&3527,),
Content(5,&&3527,&&3527,&&3527,&b&&3527,&&3527,&&3527),,
Content(6,&&3527,&&3527,&&x27&z&&3527)]
and catalog them now:
br/>br/>br/>br/>gt&Catalog.Index&U Doc(Intid.Register(Entry),entry)
now let&=3535;x27;s register a query utility:
br/>gt>gt&mp>gt;from hurry.query.query.query import query query
ampgtry
gt>gt
gt>amphury>interport getutility
gt>amphury>from mpury
return [e.id for e in sorted(list(r))]
FieldIndex Queries
------------------
We can query for all objects indexed in this index::
>>> from hurry.query import All
>>> f1 = ('catalog1', 'f1')
>>> displayQuery(All(f1))
[1, 2, 3, 4, 5, 6]
Now for a query where f1 equals a::
>>> from hurry.query import Eq
>>> f1 = ('catalog1', 'f1')
>>> displayQuery(Eq(f1, 'a'))
[1, 2, 4]
Not equals (this is more efficient than the generic ~ operator)::
>>> from hurry.query import NotEq
>>> displayQuery(NotEq(f1, 'a'))
[3, 5, 6]
Testing whether a field is in a set::
>>> from hurry.query import In
>>> displayQuery(In(f1, ['a', 'X']))
[1, 2, 3, 4, 5]
Whether documents are in a specified range::
>>> from hurry.query import Between
>>> displayQuery(Between(f1, 'X', 'Y'))
[3, 5, 6]
You can leave out one end of the range::
>>> displayQuery(Between(f1, 'X', None)) # 'X' < 'a'
[1, 2, 3, 4, 5, 6]
>>> displayQuery(Between(f1, None, 'X'))
[3, 5]
You can also use greater-equals and lesser-equals for the same purpose::
从Hurry.Query Import Ge,Le
gt&>du displayquery(GE(F1,Amp&3527 X27&Amp&3527);br/>[1,2,3,4,5,6]>br/>>;displayquery(le(f1,&;x27;x&;x27;)
[3,5]
it&;x27;也可能与~operator::
&;gt&;gt;amp;gt;gt;amp;gt;displayquery(~eq(f1,&;x27;a&;x27;&;x27;))
[3,5,6]
[3,5,5,6]
&;amp;):
&;gt&;gt&;gt;f2= ('catalog1', 'f2')
>>> displayQuery(Eq(f1, 'a') & Eq(f2, 'b'))
[1, 4]
Using or (|)::
>>> displayQuery(Eq(f1, 'a') | Eq(f2, 'b'))
[1, 2, 4, 5]
These can be chained::
>>> displayQuery(Eq(f1, 'a') & Eq(f2, 'b') & Between(f1, 'a', 'b'))
[1, 4]
>>> displayQuery(Eq(f1, 'a') | Eq(f1, 'X') | Eq(f2, 'b'))
[1, 2, 3, 4, 5]
And nested::
>>> displayQuery((Eq(f1, 'a') | Eq(f1, 'X')) & (Eq(f2, 'b&;x27;;eq(f2,&;x27;c&;x27;)
[1、2、3、3、4、5]
&;quot;和&;quot;以及&;quot;或&;quot;或&;quot;或&;也可以拼写不同的拼写:
&;gt;amp;gt;amp;gt;&;gt;或者
&;gt;amp;gt;amp;gt;displaqueryqueryqueryquery;displaqueryqueryqueryqueryquery;或者
&;gt;或者
&;gt;gt;或者
&;(和(方程式(F1,&;X27;A&AMx27;)、eq(f2,&;x27;b&;x27;)))
[1,4]
&;gt;&;gt;&;gt;gt;gt;显示查询(或(eq(f1,&;&;x27;a&;&;&;x27;))
[1,2,4,4,5]
[1,2,4,5]
<1,2,4,4,5]
<1,1,2,2,4,2,4,>in和&;amp;
的组合-
x27;in&;x2的组合7; and '&'::
>>> displayQuery(In(f1, ['a', 'X', 'Y', 'Z']))
[1, 2, 3, 4, 5, 6]
>>> displayQuery(In(f1, ['Z']))
[]
>>> displayQuery(In(f1, ['a', 'X', 'Y', 'Z']) & In(f1, ['Z']))
[]
SetIndex queries
----------------
The SetIndex is defined in zc.catalog.
&;gt;&;gt;&;gt;来自匆忙查询导入集
catalog.catalog.catalog.catalog的重要性导入。catalog<>>和catalog.gt>&.gt&;gt;&;gt;amp;gt;amp;gt;&;gt;gt;amp;gt;amp;gt;gt;gt;和gt;gt;catalog==catalog(((((((((((((((((((((((((((((((((())))>&&&&&&&&&;&&&;&&;>>>>>>>>>>>>>>> T T T T T T T T T T T T T T T amp;gt;&;gt;&;gt;来自zc.catal目录索引导入设置目录索引
&;gt;amp;gt;gt;catalog[&;x27;f1&;x27;]=setindex(&;x27;f1&;x27;x27;,icontent)
&;gt;gt;amp;gt;gt;catalog[&;x27;x27;x27;x27;x27;&;x27;]=fieldindex(&;x27;x27;x27;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;x27;&;x27;&;x27;&;&;&;&;gt;&;gt;gt;gt;7;,icontent)
A:
amp;gt;&;gt;&;gt;内容[
内容(1)[&35;x27;a&35;x27;,&;x27;b&35;x27;,&;35x27;c&35;x27;],
内容(2,[&35;x27;a&35;x27;],1),
内容(3,[&35;x27;b&35;x27;],1),
内容(4,[&35;x27;c&35;x27;,&35;x27;d&35;x27;],2),
内容(5,[&35;x27;b&35;x27;,&35;x27;c&35;x27;],2),
内容(6,[&35;x27;a&35;x27;,&35;x27;c&35;x27;],2),
内容(7,[&35;x27;z&35;x27;],2),
content(8)[,2][35没有值,因此没有索引。
目录索引文档(初始注册)(entry),entry)
我们可以查询所有索引对象:
&;gt;&;gt;displayquery(set.all(f1))
[1、2、3、4、5、6、7]
>> displayQuery(set.AnyOf(f1, ['a', 'c']))
[1, 2, 4, 5, 6]
>>> displayQuery(set.AnyOf(f1, ['c', 'b']))
[1, 3, 4, 5, 6]
>>> displayQuery(set.AnyOf(f1
[1,2,6]
>a&;x27;all&;x27;all&;&;x27;查询返回所有
>包含所有列出值的文档的所有文档:
&;gt;amp;gt;amp;gt;amp;gt;displayquery(set.all of(f1,[&;x27;a&;x27;x27;)))displayquery(set.allof(f1,[&;x27;a&;x27;x27;))))
&;gt;&;gt;&;gt;displayquery(set.allof(f1,[&;x27;a&;x27;&;x27;b&;x27;&;x27;&;x27;&;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;&;x27;&;x27;&;x27;&;x27;c&;&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;x27;)))
[1,6]
下一组有趣的查询允许您对
值进行求值例如,您可以要求在一组特定值之间的所有对象:
>displayquery(set.setbeetween(f1,&;&;&;&;x27;x27;&;&;x27;&;x27;&;&;x27;&;&;x27;&;&;x27;)
[1、2、3、3、4、4、5、5、6]
&;gt;&;gt;amp;gt;amp;gt;&;gt;gt;displayquery(set.setbeetbeetweetweetweetweetween(set.setsetsetsetsetbeetbeetweetweetweetween(f1,&;(一层,&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;&;&;&;&;&;&;&;&;x27;&;&;&;x27;c&;&;x27;c&;&;&;x27;&;&;x27;&;&;x27;c&;&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;&;x27;&;&;x27;&;&;&;x27;&;&;x27;&;&;&;>[1,3,5]
&;gt;&;gt;>;显示查询(设置中间点(f1,&;#x27;a&;x27;,&;x27;c&;x27;,
…排除_min=true,排除_max=true))
[1,3,5]
&;gt;amp;gt;amp;gt;displayquery(set.setbetween(f1,&;x27;c&;x27;x27;x27;;x27;x27;;x27;;x27;x27;;x27;;none))
[1,4,5,5,6,7]
>amp;gt;amp;gt;gt;amp;gt;gt;gt;displayquery;displayquery(set.setbetweetweetween(f1,none,&setbetween,上午x27;c&;x27;,exclude&max=true))
[1,2,3,5,5,6]
>您可以链式设置查询:
&;gt;amp;gt;gt;displayquery;displayquery;displayquery(set.anyof(f1,[&;x27;a&;x27;])&;amp;eq(f2,1))
[1,2]
还支持"zc.catalog"扩展数据块。第一个查询是
``extentany``,它返回与该范围匹配的所有数据。如果
区段是"none",则返回所有文档ID:
&;gt;&;gt;displayquery(set.extentany(f1,none))
[1、2、3、4、5、6、7]
从zc.catalog.extentCatalog import filterextent
&;gt;&;gt;extent=filterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(4)中的i:
…extent.add(i,i)
然后只返回前四个:displayquery(set.extentany(f1,extent))
[1,2,3,4]
a mp;gt;gt;amp;gt;amp;gt;id=IntID.register(content(9,&;x27;b&;x27;))
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;id=IntID.register(content(10,&;&;x27;c&;&;x27;))
&;gt;amp;gt;amp;gt;gt;id=IntID.register(content(11,&;x27;a&;x27;a&;x27;&;x27;)))
&;gt;gt;gt;amp;gt;gt;gt;id=IntID=IntID.register.register.regist7;)
&a mp;gt;&;gt;范围=FIalterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(11)中的i:
…extent.add(i,i)
&;gt;&;gt;&;gt;displayquery(set.extentnone(f1,extent))
[8,9,10,11]
valueindex查询
---------
标准字段索引的n
。
&;gt;&;gt;&;gt;from hurry.query import value
让&;x27;设置使用此索引的目录。"`valueindex``在
``zc.catalog``中定义。让&;x27;s制作一个使用它的目录:
&;gt;&;gt;&;gt;intid=dummyintid()
&;gt;&;gt;提供功能(intid,zope.intid.interfaces.iintid)
&;gt;&;gt;&;gt;从zope.catalog.interfaces导入icatalog
&;gt;&;gt;from zope.catalog.catalog import catalog
&;gt;&;gt;catalog=catalog()
&;gt;&;gt;&;gt;provideutility(catalog,icatalog,&;x27;catalog1&;x27;)
&;gt;&;gt;from zc.catalog.catalogindex import valueindex
&;gt;&;gt;目录[&;x27;f1&;x27;]=valueindex(&;x27;f1&;x27;,icontent)
内容(1,&;x27;a&;x27;),
…内容(2,&;x27;b&;x27;),
…内容(3,&;x27;c&;x27;),
…内容(4,&;x27;d&;x27;),
…内容(5,&;x27;c&;x27;),
…内容(6,&;x27;a&;x27;)]
index.index_doc(intid.register(entry,entry),entry)
>我们查询所有索引对象:
&;gt;amp;gt;gt;gt;gt;f1=(&;x27;Catalog1&;x27;&;&;x27;f1&;&;x27;)
&;gt;amp;gt;gt;displayquery(value.all(f1))
[1,2,3,4,5,5,6]
1,2,3,3,4,4,5,5,5,6]
<1,1,2,2,3,3,3,3,3,3,/>
现在就让&;x27;s搜索所有"f1``f1``等于&;x27;a&;x27;
&;gt;amp;gt;amp;amp;gt;amp;gt;gt;gt;f1=(&;x27;Catalog1&;x27;&;x27;&;x27;f1&;x27;)
&;gt;amp;gt;gt;amp;gt;gt;x27;显示查询(value.eq(f1,&;x27;a&;&;x27;a&;&;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;gt;gt;f1;&;x27;&;&;x27;&;&;&;x27;&(x27;)
[1,6]
其中"f1"不等于&;x27;a&;x27;;这比一般的"x27"运算符更有效:
&;gt;>;displayquery(value.noteq(f1,&;x27;a&;x27;))
[2,3,4,5]
ery
不会崩溃。
&;gt;&;gt;&;gt;displayquery(value.noteq(f1,&;x27;z&;x27;))
[1、2、3、4、5、6]
[&下一组有趣的查询允许您对
值进行评估。例如,您可以要求在一组特定的
>值之间的所有对象:
&;gt;gt;amp;gt;gt;displayquery(value.betwe介于(f1,&;x27;a&;x27;&;&;x27;&;&;x27;&;&;x27;&;&;&;x27;)&br/>[1、2、3、3、5、5、6]
&;gt;gt;amp;gt;gt;displayquery(value.bet介于(f1,&;&;&;&;gt;gt;之间)displayquery 35x27;A和X27;&;x27;c&;x27;,exclude_min=true))
[2,3,5]
&;gt;amp;gt;amp;gt;gt;displayquery(value.between(f1,&;x27;a&;x27;&;x27;&;x27;&;x27;&;&;x27;c&;x27;c&;x27;&;x27;&;c&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;&;x27;,x27;x27 amp;gt;&;gt;&;gt;显示查询(值。介于(f1,&;x27;a&;x27;,&;x27;C&;x27;,
…exclude-min=true,exclude-max=true)
[2]
>您还可以忽略范围的一端:
>displayquery(value.between.between.between(f1,&;&;x27;c&;x27;c&;x27;c&;x27;c&;x27;c&;x27;c&;x27;c&;x27;x27;c&;x27;x27;x27;c&;x27;x27;c&;x27;x27;x27;c&;x27是的#
[1,2,3,5,5,6]
>您也可以使用大于等于和小于等于等于来达到相同的目的:
&;gt;gt;amp;gt;gt;displayquery(value.ge(f1,&;&;x27;c&;&;x27;)
[3,4,5]
&;gt;gt;gt;&;gt;gt;
[3,4,5]
&;gt;gt;gt;gt;displayquery(value.le(f1,&;&;x27;c&;&;&;&;&;&;&;&;x27;)
[ 1, 2, 3,5,6]
您可以链接值查询:
&;gt;&;gt;displayquery(value.ge(f1,&;x27;c&;x27;)&;value.le(f1,&;x27;c&;x27;)
[3,5]
"value"模块还支持"zc.catalog"范围。第一个查询是
``extentany``,它返回与该范围匹配的所有数据。如果
范围是"none",则返回所有文档ID:
&;gt;&;gt;displayquery(value.extentany(f1,none))
[1、2、3、4、5、6]
rom zc.catalog.extentCatalog import filterextent
&;gt;&;gt;extent=filterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(4)中的i:
…extent.add(i,i)
然后只返回前四个:displayquery(value.extentany(f1,extent))
[1,2,3,4]
&;gt;amp;gt;amp;amp;gt;id=IntID.register(content(7,&;x27;b&;x27;))
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;id=IntID.register(content(8,&;&;x27;c&;&;x27;))
&;gt;amp;gt;amp;gt;gt;id=IntID.register(content(9,&;x27;a&;x27;a&;x27;))
&;gt;gt;id=IntID=IntID.register.register(content(content(9,&;9,&;x27;7;)
&;gt;&;gt;范围=FIalterextent(lambda extent,uid,obj:true)
&;gt;&;gt;&;gt;对于范围(9)中的i:
…扩展。添加(i,i)displayquery(value.extentnone(f1,extent))
[7,8,9]
此上下文确定要搜索的索引。
导入zope.component.interface
&;gt;&;gt;&;gt;导入zope.interface
&;gt;&;gt;intid1=dummyintid()
&;gt;&;gt;@zope.interface.implementer(zope.component.interfaces.icomponentlookup)
…类mocksite(对象):
…定义初始化(自身):
…self.registry=组件(&;x27;组件&;x27;)
…def queryutility(self,interface,name=&;x27;&;x27;,default=none):
…如果name==&;x27;&;x27;:返回intid1
…否则:返回目录2
…def getsitemanager(self):
…自zope.component.hooks导入网站设置站点(site1=mocksite)
&;gt;gt;amp;gt;gt;amp;gt;gt;amp;gt;amp;gt;amp;gt;br/>&;gt;gt;amp;gt;amp;gt;amp;gt;gt;设置站点(site1)
&;gt;gt;amp;gt;amp;gt;gt;Catalo2[&;x27;f1&;x27;&;x27;&;x27;&;amp;gt;gt;amp;gt;gt;gt;amp;gt;gt;amp;gt;gt;gt;gt;amp;gt;gt;gt;gt;gt;2;Catalo2[&;&;x27;x27;内容)
&;gt;&;gt;&;gt;内容=[
…内容(1,&;x27;a&;x27;),
…内容(2,&;x27;b&;x27;),]
&;gt;&;gt;&;gt;对于内容中的条目:
…目录2.索引文档(intid1.注册(entry),entry)
&;gt;>;displayquery(在(f1,[&;x27;a&;x27;,&;x27;b&;x27;]),context=site1)
[1,2]
&;gt;&;gt;&;gt;catalog=catalog()
&;gt;&;gt;&;gt;提供实用性(catalog,icatalog,&;x27;catalog1&;x27;)
&;gt;gt;> catalog['f1'] = FieldIndex('f1', IContent)
>>> catalog['f2'] = FieldIndex('f2', IContent)
>>> catalog['t'] = TextIndex('t1',i内容)
first let&;x27;s设置一些新数据:
&;gt;&;gt;content=[
…内容(1,&;x27;a&;x27;,2,t1=&;x27;美丽胜于丑陋。&;x27;),
…内容(2,&;x27;a&;x27;,3,t1=&;x27;显式优于隐式,
…内容(3,&;x27;b&;x27;,9,t1=&;x27;简单优于复杂的&;x27;),
…内容(4,&;x27;c&;x27;,8,t1=&;x27;复杂优于复杂的&;x27;),
…内容(5,&;x27;c&;x27;,7,t1=&;x27;可读性计数&;x27;),
…内容(6,&;x27;a&;x27;,1,t1=&;x27;虽然实用性胜过纯粹性&;x27;)]
,现在就对它们进行分类:
&;gt>catalog.index_doc(intid.register(entry),entry)
query=getutility(iquery)
…r=query.searchresults(q,context,**kw)
…返回[e for e in r]
如果不在查询本身中使用排序,则结果集具有未定义的
顺序。&;quot;手动&;quot;将结果排序到此处以使可测试的结果具有可测试的结果。
&;gt;amp;gt;gt;f1=(&;&;x27;Catalog1&;&;x27;&;x27;f1&;x27;)
&;gt;&;gt;&;gt;&;gt;&;gt;[r for r in sor排序(displaresult(displaresult,eq(f1,&;&;x27;a&;x27;x27;x27;&;x27;x27;&;x27;&;x27;&;gt;gt;gt;gt;f1;&;f1=))]
[<;内容&&;amp;amp;amp;amp;amp;amp;lt;content&;2&;amp;amp;gt;&;lt;content&;6&;amp;amp;gt;]
>现在,我们对f2索引进行排序。现在,我们对f2索引进行排序。现在,我们对f2索引进行排序。
&;gt;amp;gt;amp;gt;gt;f1=&;&;x27;&;&;x27;f1&;&;&;x27;f1&;&;&;&;x27;&;x27;&;&;&;&;&;x27;&;&;&;x27;&;& x27;)
&;gt;&;gt;&;gt;显示(F1,&;x27;A&;x27;),排序字段=(&;x27;Catalog1&;x27;&;x27;x27;&;x27;&;x27;))
[&;lt;content&;quot;6&;amp;amp;gt;&;lt;content&;1&;amp;quot;&;gt;&;lt;content&;lt;content&;content&&;quot;&;lt;content&;content&;quot;&;content&&&;content&&&&&&&;gt;、&;lt;content&;content&&&&&&&&;"2";&;gt;]
颠倒顺序。
&;gt;>> f1 = ('catalog1', 'f1')
>>> displayResult(Eq(f1, 'a'), sort_field=('catalog1', 'f2'), reverse=True)
[<Content "2">, <Conte&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;]
>我们可以限制找到的物品的数量。我们可以限制找到的物品的数量。我们可以限制找到的物品的数量。显示结果(公式(f1,&;x27;a&;x27;), sort_field=('catalog1', 'f2'), limit=2)
[<Content "6">, <Content "1">]
>>> f1 = ('catalog1', 'f1')
>>&;gt;显示结果(eq(f1,&;x27;a&;x27;)、排序字段=(&;x27;Catalog1&;x27;&;x27;x27;&;x27;Catalog1&;x27;&;x27;&;x27;)、限制=2,开始=1)
[&;lt;content&;lt;content&;quot;1&;amp;gt;、&;lt;content&;quot;2&;amp;gt;&;gt;&;gt;&;lt;content&;2&;2&;2&;amp;amp;amp;gt;gt;&;gt;&;gt;gt]
我们也可以限制反向结果集。
&;gt;&;gt;&;gt;f1=(&;x27;目录1&;x27;,&;x27;f1&;x27;)
&;gt;&;gt;显示结果(
…eq(f1,&;x27;a&;x27;),排序字段=(&;x27;目录1&;x27;,&;x27;f2&;x27;),限制=2,反向=真)
&;amp;amp;amp;amp;amp;amp;amp;lt;content&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp显示结果(公式(f1,&;)#x27;a&;x27;,sort\field=catalog&;x27;x27;x27;x27;)
[&;lt;content&;quot;6&;quot;amp;gt;&;lt;content&;quot;1&;quot;amp;amp;gt;&;lt;content&;content&;quot;2&;quot;2&;quot;gt;]
>无论何时使用不支持的字段进行排序,只要使用不支持的字段进行排序,都会出现错误,无论何时使用不支持的字段进行不支持的排序,只要使用不支持的字段进行排序,只要使用不支持的字段进行排序,只要使用不支持的字段进行排序,则错误br/>raised.
>>> f1 = ('catalog1', 'f1')
>>> displayResult(Eq(f1, 'a'), sort_field=('catalog1', 't'))
Traceback (most recent call last):
...
值错误:目录目录1中的索引t不支持排序。
在本测试中,假设
>测试索引的自然顺序具有足够的确定性,足以用作适当测试。
&;gt;gt;amp;gt;gt;f1=(&;x27;Catalog1&;x27;&;x27;f1&;x27;
&;gt;&;gt;gt;显示结果(eq(f1,&;x27;a&;x27;&;x27;)显示结果(eq(f1,&f1,&;x27;a&;x27;&;x27;))的自然顺序具有足够的确定性,足以用作适当测试。
<
&;gt;gt我是说,限制=2)
,&;lt;content&;quot;1&;amp;amp;gt;&;lt;content&;quot;2&;quot;amp;gt;]
&;gt;amp;amp;gt;f1=&;x27;Catalog1&;x27;&;x27;&;&;x27;&;&;x27;&;&;x27;
&;gt;&;lt;lt;content&;gt;2&;amp;amp;amp;gt;&;amp;gt;&;gt;&;gt;
;br/>&;amp;gt;amp;amp;gt;gt均衡器(f1,&;x27;a&;x27;,开始=1)
[&;amp;lt;content&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;amp;amp;amp;amp;amp;amp;amp;gt;
;br/>;amp;amp;gt;amp;amp;amp;amp;gt;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;amp;gt;gt;gt;f1;&;amp;amp 35x27;a&;x27;,开始=1,限制=1)
[<;
&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;f1=(&;x27;Catalog1&;x27;&;x27;&;&;x27;&;x27;)
&;gt;&;amp;gt;amp;gt;&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;
&;gt;&;gt;&;gt;&;gt;&;gt;&;gt;&;2;amp;gt;gt;&;gt;&;gt;&;gt;gt;/>[<;内容";6";>;,<;继续tent";2";gt;]
结果计数器
----
>结果对象提供有关结果的元数据。
query=getutility(iquery)
…return query.searchresults(q,context,**kw)
>使用排序字段执行查询会给出定义良好的结果:
&;gt&;gt;gt;gt;f1=(&;&;x27;Catalog1&;x27;&;&;x27;&;&;&;x27;)
&;gt;gt;gt;result=getresult(eq(f1,&;&;x27;a&&;x27;&;a&;&;amp;amp;gt;gt;gt;gt;gt;gt;f1;&;f1;&;x27;&;&;&;,所以对于e-in-result,
>&;gt;&;gt;&;gt;[e-e-in-result]
[&;lt;content&;quot;1&;amp;gt;gt;&;lt;content&;quot;2&;quot;amp;gt;&;lt;content&;content&;6&;content&;gt;]
我们可以访问&;&;我们可以访问&;&;amp;gt;6&;quot;gt;&;gt;]
我们可以访问&;&;我们可以访问&;&;&;我们可以访问&;&;我们可以35x27;总计&;x27;和&;#x27;统计&;x27;属性和&;x27;first()&;&;x27;first;&;&;&;x27;对结果:
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;结果。总计
3
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;x27;属性和&;&;x27;first;&;&;x27;first;&;&;&;x27;first;&;&;&;x27;对结果:结果:结果:结果:总计
>3
>3
&/>
查在返回的数据中会反映出返回的数据:
&;gt;amp;gt;gt;result=getresult(eq(f1,&;&;x27;a&;x27;)、sort(sort)field=catalog[&;x27;f1&;x27;,start=1)
&;gt;&;gt;&;gt;对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-in-result,对于e-result,对于e-in[<;内容";2";&;gt;,<;内容";6";gt;]
它还会更改&;x27;计数&;x27以及&;x27;first()&;&;x27;
&;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;amp;gt;lt;result;result.result.count
2
&;gt;amp;gt;amp;gt;result.first()
&;lt;content&;quot;2&;amp;quot;amp;gt;
>但&;x27;total&;&;x27;仍然反映所有匹配项,包括隐藏的第一个匹配项在内的所有匹配项仍然反映所有匹配项,包括隐藏的第一个匹配项:
br/>br/>>
&;gt;&;gt;&;gt;结果。总计
3
添加限制:
&;gt;&;gt;result=getresult(eq(f1,&;x27;a&;x27;),sort_field=catalog[&;x27;f1&;x27;],start=1,
…限制=1)
&;gt;amp;gt;amp;gt;gt;[e for e in result]
[&;lt;content&;quot;2&;quot;amp;gt;]
&;gt;amp;gt;amp;amp;gt;结果。总
>3
3
&;gt;amp;gt;amp;gt;amp;gt;结果。计数
1
&;gt;amp;gt;amp;gt;amp;amp;gt;amp;gt;&;gt;&;gt;&;gt;&;gt;&;gt;e for e in result;e in result;
&;lt;lt;内容&;2&&;gt;
可用于空结果:
&;gt;amp;gt;gt;result=getresult(eq(f1,&;x27;foo&&;x27;)、sort\field=catalog[&;x27;f1&;x27;))
&;gt;gt;amp;gt;gt;[e for e-in-result]
>
>
&;gt;amp;gt;amp;gt;amp;gt;result;result;result;result;result;total
0
>0
0
<
&;gt;gt;gt;gt/>&;gt;&;gt;&;gt;结果。计数
0
&;gt;&;gt;result.first()为none
true
wrapper
----
定义初始化(自身,父级):
…self.parent=父项
…定义代表(自我):
…return '<Wrapper "{}">'.format(self.parent.id)
>>> f1 = ('catalog1', 'f1')
>>> displayResult(Eq(f1, 'a'), wrapper=Wrapper)
[<Wrapper "1">, <Wrapper";2";gt;,<;wrapper";6";gt;]
query=getutility(iquery)
…r=query.searchresults(q,context,**kw)
…return [(e.__parent__, e) or None for e in r]
>>> f1 = ('catalog1', 'f1')
>>> displayParent(Eq(f1, 'a'), limit=2)
[(None, <Content "1">), (None, <Content "2">)]
&;gt;amp;gt;amp;amp;gt;parent=content(&;x27;parent&;x27;)
&;gt;amp;gt;amp;gt;amp;gt;gt;displaparparparparparent(eq(f1,&;x27;a&;x27;)&;gt;gt;amp;gt;gt;displaparparparparparparparparparent,eq(f1,&;x27;a&;x27;),limit=2,loc定位到=parparparent)
(&;lt;content&;gt;parent&;amp;gt;&;gt;&;lt;content&;1&;amp;1&;amp;amp(&;lt;内容";父级";&;gt;,&;lt;c)&;quot;2&;quot;amp;gt;)]
>这可以与包装一起使用:
&;gt;gt;amp;gt;gt;displayparparent(eq(f1,&;x27;a&;x27;,limit=2,wrapper=wrapper,locate_to=parent)
[(&;lt;content&;quot;parent&;quot;parent&;gt;、&;lt;wrapper&;1&;1&;1&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;gt;gt;gt;gt;gt quot;>;),(<;内容";父级&aamp;amp;amp;amp;lt;wrapper&;amp;quot;2&;amp;amp;gt;gt;)]
>>
&;gt;amp;gt;amp;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;x27;T&;x27;)
>;&;gt;gt;显示结果(文本(T1,&;x27;更好&;x27;))
[&;lt;内容";1";gt;,&;lt;内容";2";gt;,&;lt;内容";3";gt;,&;lt;内容";4";gt;]
无效文本查询返回空结果::
&;gt;>;显示结果(文本(T1,&;x27;?*&;x27;)
[]
其他术语
----
您可以进行差异处理,这里包含更好但确实
的所有项都有一个作为f1的项:
&;gt;&;gt;&;gt;来自匆忙的。查询导入差异
&;gt;&;gt;显示结果(差异(文本(T1,&;x27;Better&;x27;,eq(f1,&;x27;a&;x27;))
[&;lt;content&;quot;3&;quot;gt;&;lt;content&;quot;4&;quot;&;quot;&;gt;]
有一个特殊术语允许将对象与目录
查询混合使用::
&;gt;&;gt;>br/>amp;gt;&;gt;来自HURry.查询导入对象
>;amp;gt;>;显示结果(对象(内容))
[&;lt;内容";1";amp;gt;,&;lt;内容";2";amp;gt;,&;lt;内容";3";gt;,&;lt;内容";4";amp;gt;,&;lt;内容&;quot;5";gt;,<;content";6";gt;]
gt;gt;all-intids=[intid.getid(x)for x in content]
&;gt;&;gt;displayResult(ids(*all-intids))
[&;lt;content";1&;quot;,&;lt;content";2&;quot;,<;content";3";,&;lt;content";4&;quot;gt;,<;content";5";gt;,&;lt;content";6";gt;]
&;gt;&;gt;奇数输入=[如果x.id为%2,则内容中x的输入.getid(x)]
>
>变化
====
===
>
>3.1(2018-08-08-08)3.1(2018-08-08)3.1(2018-08-08)3.1(2018-08-08-08)3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0(2018-01-1)9)
----
-除了python 2.7之外,还支持python 3.4、3.5和3.6
-准备python3的清理支持:
错误修复:
o api更改:修复和(加权=)关键字参数输入错误
o api更改:删除完全断开的"include_minimum"and``include_maximum`
setbetween()的参数,改为提供``exclude_min``和``exclude_max``参数。
o api change:fix breaked setbetween.apply():introduct``cache``arg
o fix extentnone()super delegation bug
o fix timingawarecaching.report()edge condition bug
主要:
o删除不支持的事务缓存
次要:
o澄清快速查询环境和搜索结果(计时=)类型
o修复计时缓存。report()输出类型
o澄清查询。searchresults(缓存=)参数类型
o删除无法访问的代码path from and()
dev:
o最大化测试覆盖率
o添加travis和tox测试配置
o绕过引导程序。py
o各种python3兼容性准备
2.6(2018-01-10)
----
-更新依赖项以不依赖zodb3 anymore.
2.5(2017-07-17)
----
-`sort戋field`可以是索引名或提供'iIndexSort'本身的对象。
-`searchResults()`接受可选参数'locate戋to'和'wrapper'。
"locate_to"用作放置在
结果对象周围的位置代理的"父级"。"wrapper"是一个可调用的回调函数,它应该为其参数接受一个参数。
2.4(2017-06-22)
----
-don&;x27;不抛出类型错误切片未排序的结果,修复了.3(2017-04-26)
————————————————————————————————————————————————————————————————————————————————————————————————————————————————调用方可能仍然希望得到类似
对象的结果。
2.2(2017-04-26)
----
-搜索结果的缓存选项现在接受类似于dict的值,它将使用该值允许在多个searchresults()
调用上缓存结果。缓存失效则由调用者负责。
2.1(2017-02-07)
----
-添加查询所需时间的可能性。可以使用"searchresults"的新"timing"选项或环境变量"hush-query-timing"对其进行控制。
2.0.1(2016-09-08)
----
--修复文本项中的日志行以进行无效文本搜索。
2.0(2016-09-07)
-
-添加新术语:差异。它在作为参数传递的第一个和
以下术语之间起作用。
-添加新术语:objects。它从参数中传递的对象中创建一个结果。它允许您将实际对象与现有的目录
查询(例如,与、或或差异)混合使用。
-向searchresult添加一个选项start以跳过
结果集中的第一个结果。
-扩展searchresult的结果。您有关于结果的附加信息
,包括没有
开始/限制限制的结果总数。名为first()的方法只返回
第一个结果(如果可用)或不返回。
-向searchresult添加一个选项缓存,以缓存zope事务中每个
项的结果,从而加快类似的查询。如果禁用
,则术语仍将缓存在同一个查询中。
1.2(2015-12-16)
----
*添加对all查询的支持。
1.1.1(2012-06-22)
----
*extentnone in set.py缺少一个参数"index\u id"。感谢danilo
botelho提供的错误报告。
1.1.0(2010-07-12)
----
*允许查询的searchresults方法获取一个额外的关键字
参数"sort\u field",该参数定义了要排序的(目录名、索引名)。该目录中的索引应实现iIndexSort。
除此关键字参数外,还可以传递"limit"和"reverse"关键字参数,这将限制排序结果集和/或反转其
顺序。
*允许查询对象的SearchResults方法获取额外的
可选上下文参数。此上下文将确定对哪个目录执行搜索。
1.0.0(2009-11-30)
----
*刷新依赖项。使用zope.catalog和zope.intid,而不是分别使用zope.app.catalog和zope.app.intid。don&;x27;t zope.app.zapi.
*使包描述更加现代化。
*清理代码样式。
0.9.3(2008-09-29)
----
*错误:当索引中的所有值都满足noteq条件时,noteq查询不再失败。
0.9.2(2006-09-22)
---------
*芝士店的第一个版本。
0.9.1(2006-06-16)
---------
*使zc.catalog成为"快速查询"的依赖项。
0.9(2006-05-16)
----
*将"快速查询"与其他"快速查询"软件包分开。蛋化工作。
*支持zc.catalog中的valueindex。
>0.8(2006-05-01)
————