2012-05-23 105 views
1

我正在使用Products.AdvancedQuery爲我的網站構建替代的LiveSearch機制。到目前爲止,所有工作都完美無缺,但標準查詢對所有可用內容類型執行搜索,包括在@@ search-controlpanel中標記爲不可搜索的內容類型。獲取Plone 4中的可搜索內容類型列表

我希望AdvancedQuery根據@@ search-controlpanel中指定的內容動態地過濾掉不可搜索的內容。我怎樣才能做到這一點?

如果AQ無法做到這一點,我可以在查詢目錄後立即過濾結果。我需要一個標記爲可搜索的內容類型名稱(或接口)列表。我怎樣才能獲得這樣的清單?

回答

2

假設你可以得到類型的元組或列表控制面板黑名單編程,這可能爲(進口消隱)是簡單:

>>> query = myquery & AdvancedQuery.Not(AdvancedQuery.In(MY_TYPE_BLACKLIST_HERE)) 
>>> result = getToolByName(context, 'portal_catalog').evalAdvancedQuery(query) 
+0

感謝您的指針。您幫助我瞭解如何使其發揮作用。我添加了一個描述我的解決方案的回覆。 – zedr

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 
相關問題