2017-09-25 43 views
1

我使用的是默認的後臺數據庫實現搜索功能在我的項目工作鶺鴒默認搜索不與未英語領域

class BlogPage(Page): 
    date = models.DateField("Post date") 
    intro = models.CharField(max_length=250) 
    body = StreamField([ 
     ('heading', blocks.CharBlock(classname="full title")), 
     ('paragraph', blocks.RichTextBlock()), 
     ('image', ImageChooserBlock()), 
     ('code', CodeBlock()), 
    ]) 
    tags = ClusterTaggableManager(through=BlogPageTag, blank=True) 

    search_fields = Page.search_fields + [ 
     index.SearchField('intro'), 
     index.SearchField('body'), 
    ] 
    ... 

和搜索工作以及只有bodyBlogPage模型中的字段是英文的,如果我嘗試在body字段中使用一些俄語單詞,那麼它不搜索任何東西。 我看着數據庫和我看到BlogPage具有body場這樣的:

[{"value": "\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439", "id": "3343151a-edbc-4165-89f2-ce766922d68e", "type": "heading"}, {"value": "<p>\u0442\u0435\u0441\u0442\u0438\u043f\u0440</p>", "id": "22d3818d-8c69-4d72-967e-7c1f807e80b2", "type": "paragraph"}] 

那麼,問題是鶺鴒節省Streamfield領域的Unicode字符,如果我手動在phpMyAdmin改成這樣:

[{"value": "Тест", "id": "3343151a-edbc-4165-89f2-ce766922d68e", "type": "heading"}, {"value": "<p>Тестовый</p>", "id": "22d3818d-8c69-4d72-967e-7c1f807e80b2", "type": "paragraph"}] 

然後搜索開始工作,所以也許有人知道如何防止w from在unicode中保存Streamfield字段?

+0

你沒有提到你正在使用哪個搜索後端。你使用Elasticsearch嗎?我成功地使用Elasticsearch合併德語搜索。看起來你沒有[爲索引添加額外的字段](http://docs.wagtail.io/en/v1.12.2/topics/search/indexing.html#indexing-extra-fields)。或者你是否忽略了''BlogPage''的search_fields聲明? – Moritz

+0

我已經指定了search_fields(將這些行添加到問題中),並且我猜即時在使用默認數據庫後端進行搜索。我應該怎麼做才能切換到Elasticsearch?我應該將數據庫更改爲elastichsearch並更改wagtailsearch配置? – Alexey

+0

你應該看看[docs](http://docs.wagtail.io/en/v1.12.2/topics/search/backends.html#elasticsearch-backend)開始。不過,PostgreSQL後端更容易[設置](http://docs.wagtail.io/en/v1.12.2/reference/contrib/postgres_search.html#postgres-search)。 – Moritz

回答

1

我恨這個解決辦法,但我決定只是爲了添加另一個領域search_bodysearch_intro,然後搜索使用它們:

class BlogPage(Page): 
    date = models.DateField("Post date") 
    intro = models.CharField(max_length=250) 
    body = StreamField([ 
     ('heading', blocks.CharBlock(classname="full title")), 
     ('paragraph', blocks.RichTextBlock()), 
     ('image', ImageChooserBlock()), 
     ('code', CodeBlock()), 
    ]) 
    search_intro = models.CharField(max_length=250) 
    search_body = models.CharField(max_length=50000) 
    tags = ClusterTaggableManager(through=BlogPageTag, blank=True) 

    def main_image(self): 
     gallery_item = self.gallery_images.first() 
     if gallery_item: 
      return gallery_item.image 
     else: 
      return None 

    def get_context(self, request): 
     context = super(BlogPage, self).get_context(request) 
     context['tags'] = get_all_tags() 
     context['page_url'] = urllib.parse.urljoin(BASE_URL, self.url) 
     return context 

    def save(self, *args, **kwargs): 
     if self.body.stream_data and isinstance(
       self.body.stream_data[0], tuple): 
      self.search_body = '' 
      for block in self.body.stream_data: 
       if len(block) >= 2: 
        self.search_body += str(block[1]) 
     self.search_intro = self.intro.lower() 
     self.search_body = self.search_body.lower() 
     return super().save(*args, **kwargs) 

    search_fields = Page.search_fields + [ 
     index.SearchField('search_intro'), 
     index.SearchField('search_body'), 
    ] 
    ... 

搜索/ views.py:

def search(request): 
    search_query = request.GET.get('query', None) 
    page = request.GET.get('page', 1) 

    # Search 
    if search_query: 
     search_results = BlogPage.objects.live().search(search_query.lower()) 
     query = Query.get(search_query) 
    ... 
0

阿列克謝,謝謝!

但我得到保存方法的雙重電話。

而且我應該使用此代碼:

def save(self, *args, **kwargs): 
    search_body = '' 
    if self.blog_post_body.stream_data and isinstance(
      self.blog_post_body.stream_data[0], dict): 
     for block in self.blog_post_body.stream_data: 
      if block.get('type', '') in ('some_header', 'some_text'): 
       search_body += str(block['value']) 
    self.search_body = search_body 
    super(BlogPost, self).save(*args, **kwargs) 
+0

是的,也許你的代碼更好,但是我認爲這個問題與SqLite db有關,當我切換到postgres時問題消失了,所以我認爲最好不要使用這種方法 – Alexey