2017-09-25 7 views
1

で作業していませんbodyフィールドにロシア語を使用しようとすると、何も検索されません。BlogPageモデルのフィールドは英語です。 は、私はデータベースを見て、私はbodyフィールドこのようBlogPageが持っていることを参照してください。セキレイのデフォルトの検索では、私は私のプロジェクトでは、検索機能のデフォルトのデータベースバックエンドを使用していますが英語でないフィールド

[{"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"}] 

だから、問題は、私は手動でこれまでのphpMyAdminに変更した場合セキレイは、Unicode文字としてStreamfieldフィールドを保存している:

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

検索が始まるので、ワグテールがユニコードでフィールドを保存するのを防ぐ方法を知っているかもしれません。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/ja/v1.12.2/topics/search/backends.html#elasticsearch-backend)をご覧ください。 PostgreSQLのバックエンドは[setup](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

関連する問題