Zope サイトの非常に徹底的な検索メカニズムを構築しています。検索にはさまざまな方法があり、同じインデックスで複数の値を検索する (そしてそれらすべてに一致する) 場合があるため、AdvanceQuery を使用する必要があります。私は次のようにクエリを作成しました:
if self.text():
text_query = And()
for t in self.text():
text_query.addSubquery(Eq('SearchableText',t))
if self.sector()
sector_query = And()
for s in self.sector()
sector_query.addSubquery(Eq('sector',s))
if self.region():
region_query = Eq('region',self.region())
if self.role():
role_query = Eq('role',self.role())
self.text() などは別の場所で定義されており、クエリが存在しない場合は False を返します。self.text() と self.sector() は値が 1 つしかない場合でも常にリストを生成するため、心配する必要はありません。 .
私は最後のビットを行う方法も知っています。
return self.context.portal_catalog.evalAdvancedQuery(query)
私が理解できないのは、それをつなぎ合わせて「クエリ」を定義する方法です。このようなことをすると、すべてが存在しないと壊れます。
query = text_query & sector_query & region_query & role_query
これはおそらく検索に使用する変数の完全なリストではないことに注意してください。そのため、何百もの可能な組み合わせを調べています。「クエリ」を条件付きで定義して、壊れないようにするにはどうすればよいですか?