1

Products.AdvancedQuery を使用して、サイトの代わりの LiveSearch メカニズムを構築しています。これまでのところ、すべてが完全に機能していますが、標準クエリは、@@search-controlpanel で検索不可としてマークされているものを含め、利用可能なすべてのコンテンツ タイプに対して検索を実行します。

@@search-controlpanel で指定されている内容に従って、AdvancedQuery で検索できないものを動的に除外したいと考えています。これどうやってするの?

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 に答える