Я создаю довольно тщательный механизм поиска для сайта 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() всегда создают список, даже если есть только одно значение, так что не беспокойтесь. .
Я также знаю, как сделать последний бит, например.
return self.context.portal_catalog.evalAdvancedQuery(query)
Чего я не могу понять, так это того, как сшить его вместе, чтобы определить «запрос». Если я сделаю что-то подобное, это сломается, если не все из них присутствуют:
query = text_query & sector_query & region_query & role_query
Имейте в виду, что это, вероятно, не полный список переменных для поиска, поэтому мы рассматриваем сотни возможных комбинаций. Как я могу условно определить «запрос», чтобы он не сломался?