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(&#x27;f1&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;f2&#x27;] = FieldIndex(&#x27;f2&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;f3&#x27;] = FieldIndex(&#x27;f3&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;f4&#x27;] = FieldIndex(&#x27;f4&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;t1&#x27;] = TextIndex(&#x27;t1&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;t2&#x27;] = TextIndex(&#x27;t2&#x27;, 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 mpurygt>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::

&gt;&gt;&gt; from hurry.query import All
&gt;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&gt; displayQuery(All(f1))
[1, 2, 3, 4, 5, 6]

Now for a query where f1 equals a::

&gt;&gt;&gt; from hurry.query import Eq
&gt;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&gt; displayQuery(Eq(f1, &#x27;a&#x27;))
[1, 2, 4]

Not equals (this is more efficient than the generic ~ operator)::

&gt;&gt;&gt; from hurry.query import NotEq
&gt;&gt;&gt; displayQuery(NotEq(f1, &#x27;a&#x27;))
[3, 5, 6]

Testing whether a field is in a set::

&gt;&gt;&gt; from hurry.query import In
&gt;&gt;&gt; displayQuery(In(f1, [&#x27;a&#x27;, &#x27;X&#x27;]))
[1, 2, 3, 4, 5]

Whether documents are in a specified range::

&gt;&gt;&gt; from hurry.query import Between
&gt;&gt;&gt; displayQuery(Between(f1, &#x27;X&#x27;, &#x27;Y&#x27;))
[3, 5, 6]

You can leave out one end of the range::

&gt;&gt;&gt; displayQuery(Between(f1, &#x27;X&#x27;, None)) # &#x27;X&#x27; &lt; &#x27;a&#x27;
[1, 2, 3, 4, 5, 6]
&gt;&gt;&gt; displayQuery(Between(f1, None, &#x27;X&#x27;))
[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= (&#x27;catalog1&#x27;, &#x27;f2&#x27;)
&gt;&gt;&gt; displayQuery(Eq(f1, &#x27;a&#x27;) &amp; Eq(f2, &#x27;b&#x27;))
[1, 4]

Using or (|)::

&gt;&gt;&gt; displayQuery(Eq(f1, &#x27;a&#x27;) | Eq(f2, &#x27;b&#x27;))
[1, 2, 4, 5]

These can be chained::

&gt;&gt;&gt; displayQuery(Eq(f1, &#x27;a&#x27;) &amp; Eq(f2, &#x27;b&#x27;) &amp; Between(f1, &#x27;a&#x27;, &#x27;b&#x27;))
[1, 4]
&gt;&gt;&gt; displayQuery(Eq(f1, &#x27;a&#x27;) | Eq(f1, &#x27;X&#x27;) | Eq(f2, &#x27;b&#x27;))
[1, 2, 3, 4, 5]

And nested::

&gt;&gt;&gt; displayQuery((Eq(f1, &#x27;a&#x27;) | Eq(f1, &#x27;X&#x27;)) &amp; (Eq(f2, &#x27;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 &#x27;&amp;&#x27;::

&gt;&gt;&gt; displayQuery(In(f1, [&#x27;a&#x27;, &#x27;X&#x27;, &#x27;Y&#x27;, &#x27;Z&#x27;]))
[1, 2, 3, 4, 5, 6]
&gt;&gt;&gt; displayQuery(In(f1, [&#x27;Z&#x27;]))
[]
&gt;&gt;&gt; displayQuery(In(f1, [&#x27;a&#x27;, &#x27;X&#x27;, &#x27;Y&#x27;, &#x27;Z&#x27;]) &amp; In(f1, [&#x27;Z&#x27;]))
[]


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]


&gt;&gt; displayQuery(set.AnyOf(f1, [&#x27;a&#x27;, &#x27;c&#x27;]))
[1, 2, 4, 5, 6]
&gt;&gt;&gt; displayQuery(set.AnyOf(f1, [&#x27;c&#x27;, &#x27;b&#x27;]))
[1, 3, 4, 5, 6]
&gt;&gt;&gt; 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;&gt; catalog[&#x27;f1&#x27;] = FieldIndex(&#x27;f1&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;f2&#x27;] = FieldIndex(&#x27;f2&#x27;, IContent)
&gt;&gt;&gt; catalog[&#x27;t&#x27;] = TextIndex(&#x27;t1&#x27;,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;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&gt; displayResult(Eq(f1, &#x27;a&#x27;), sort_field=(&#x27;catalog1&#x27;, &#x27;f2&#x27;), reverse=True)
[&lt;Content &quot;2&quot;&gt;, &lt;Conte&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;]


>我们可以限制找到的物品的数量。我们可以限制找到的物品的数量。我们可以限制找到的物品的数量。显示结果(公式(f1,&;x27;a&;x27;), sort_field=(&#x27;catalog1&#x27;, &#x27;f2&#x27;), limit=2)
[&lt;Content &quot;6&quot;&gt;, &lt;Content &quot;1&quot;&gt;]

&gt;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&;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.

&gt;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&gt; displayResult(Eq(f1, &#x27;a&#x27;), sort_field=(&#x27;catalog1&#x27;, &#x27;t&#x27;))
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 &#x27;&lt;Wrapper &quot;{}&quot;&gt;&#x27;.format(self.parent.id)

&gt;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&gt; displayResult(Eq(f1, &#x27;a&#x27;), wrapper=Wrapper)
[&lt;Wrapper &quot;1&quot;&gt;, &lt;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]

&gt;&gt;&gt; f1 = (&#x27;catalog1&#x27;, &#x27;f1&#x27;)
&gt;&gt;&gt; displayParent(Eq(f1, &#x27;a&#x27;), limit=2)
[(None, &lt;Content &quot;1&quot;&gt;), (None, &lt;Content &quot;2&quot;&gt;)]

&;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)
————

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

推荐PyPI第三方库


热门话题
java Kafka producer大量内存使用(泄漏?)   java NullPointerException。。。正在插入数据但无法检索数据[Mysql DB]   java spring+jpa+hibernate=没有可用于当前线程的实际事务的EntityManager无法可靠地处理“persist”调用   getelementbyid在没有ID的情况下如何在java中使用GetElementsById   java有没有一种使用WatchService强制轮询的方法?   java将值从jframe传递给另一个jframe并使用它   Java/Groovy中带重试的反应式事件处理   具有两个包装器元素的java Jackson XML ArrayList输出   java总是在范围内使用不同的随机元素   取消选择java下拉列表值   多线程如何在Java中为对象的不同成员拥有不同的同步块   java如何使用多线程从文本文件中读取输入   java Spring启动附加崩溃命令   java使用公共或单独的actionPerfomed方法有什么区别   java用Spring3.0中的SpEL替换JSP中的EL   java作为windows服务运行应用程序时无法访问共享文件夹   java xml 1.1规范中的“解析数据”是什么意思?   以编程方式设置JComboBox索引时java触发ItemListener   java Android WebView:只加载HTML,不加载JS或CSS(在某些设备中)   Java:计算do/while循环的数量