1

我正在使用 Products.AdvancedQuery 为我的网站构建替代 LiveSearch 机制。到目前为止一切正常,但标准查询对所有可用的内容类型执行搜索,包括在@@search-controlpanel 中标记为不可搜索的内容类型。

我希望 AdvancedQuery 根据@@search-controlpanel 中指定的内容动态过滤掉不可搜索的那些。我怎样才能做到这一点?

如果 AQ 做不到,我可以在查询目录后立即过滤结果。我需要一个标记为可搜索的内容类型名称(或接口)列表。我怎样才能获得这样的清单?

4

2 回答 2

2

假设您可以获得控制面板以编程方式列入黑名单的类型的元组或列表,这可能就像(省略导入)一样简单:

>>> query = myquery & AdvancedQuery.Not(AdvancedQuery.In(MY_TYPE_BLACKLIST_HERE)) 
>>> result = getToolByName(context, 'portal_catalog').evalAdvancedQuery(query)
于 2012-05-23T17:43:38.090 回答
2

好的,多亏了 sdupton 的建议,我找到了让它工作的方法。

这是解决方案(省略了明显的导入):

from Products.AdvancedQuery import (Eq, Not, In, 
                                    RankByQueries_Sum, MatchGlob)

from my.product.interfaces import IQuery


class CatalogQuery(object):

    implements(IQuery)

    ...

    def _search(self, q, limit):
        """Perform the Catalog search on the 'SearchableText' index
        using phrase 'q', and filter any content types 
        blacklisted as 'unsearchable' in the '@@search-controlpanel'.
        """

        # ask the portal_properties tool for a list of names of
        # unsearchable content types
        ptool = getToolByName(self.context, 'portal_properties')
        types_not_searched = ptool.site_properties.types_not_searched

        # define the search ranking strategy
        rs = RankByQueries_Sum(
                (Eq('Title', q), 16),
                (Eq('Description', q), 8)
             )

        # tune the normalizer
        norm = 1 + rs.getQueryValueSum()

        # prepare the search glob
        glob = "".join((q, "*"))

        # build the query statement, filter using unsearchable list
        query = MatchGlob('SearchableText', glob) & Not(
                    In('portal_type', types_not_searched)
                )

        # perform the search using the portal catalog tool
        brains = self._ctool.evalAdvancedQuery(query, (rs,))

        return brains[:limit], norm
于 2012-05-24T09:01:33.157 回答