2012-05-23 90 views
2

我想用cmsplugin-blog爲簡單的django cms主頁添加搜索功能。django cmsplugin-blog搜索索引haystack with whoose

但只有搜索索引與django-cms-facetsearch一起使用。但是facetsearch需要solr,而且我不想只爲幾個cms頁面和blogentry運行solr服務器。我只是想和whoosh一起使用haystack,因爲配置起來非常簡單。

cmsplugin-blog模型是否有多語言搜索索引?或者我必須自己寫嗎?

謝謝你的幫助......

回答

1

我有同樣的問題,使用草垛,Django的CMS,cmsplugin,博客和其他一些應用程序,以及一個設置。

我剛剛爲cmsplugin-blog和haystack創建了一個自定義搜索索引,靈感來自用於django-cms-search中常規CMS頁面的索引。看看它,它可以幫助你創建自己的。

from haystack import indexes 
from haystack import site 
from cmsplugin_blog.models import Entry, EntryTitle 
from cms.models.pluginmodel import CMSPlugin 
from django.utils.encoding import force_unicode 
import re 

def _strip_tags(value): 
    """ 
    Returns the given HTML with all tags stripped. 

    This is a copy of django.utils.html.strip_tags, except that it adds some 
    whitespace in between replaced tags to make sure words are not erroneously 
    concatenated. 
    """ 
    return re.sub(r'<[^>]*?>', ' ', force_unicode(value)) 

class BlogIndex(indexes.SearchIndex): 
    text = indexes.CharField(document=True) 
    url = indexes.CharField(stored=True, indexed=False, model_attr='get_absolute_url') 
    title = indexes.CharField(stored=True, indexed=False) 
    pub_date = indexes.DateTimeField(model_attr='pub_date', null=True) 

    def get_model(self): 
     return Entry 

    def index_queryset(self): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.filter(is_published=True) 

    def prepare_title(self, obj): 
     return EntryTitle.objects.filter(entry=obj)[0] 

    def prepare_text(self, obj): 
     title = EntryTitle.objects.filter(entry=obj)[0] 
     placeholder_plugins = CMSPlugin.objects.filter(placeholder__in=obj.placeholders.all()) 
     text = force_unicode(title) 
     plugins = list(placeholder_plugins) 
     for base_plugin in plugins: 
      instance, plugin_type = base_plugin.get_plugin_instance() 
      if instance is None: 
       # this is an empty plugin 
       continue 
      if hasattr(instance, 'search_fields'): 
       text += u' '.join(force_unicode(_strip_tags(getattr(instance, field, ''))) for field in instance.search_fields) 
      if getattr(instance, 'search_fulltext', False) or getattr(plugin_type, 'search_fulltext', False): 
       text += _strip_tags(instance.render_plugin(context=RequestContext(request))) + u' ' 
     return text 

site.register(Entry, BlogIndex) 

我會考慮把cmsplugin-博客的叉後在github上這個搜索索引的防彈版本。隨時在有用的地方使用它。