2013-10-29 1 views
3

저는 최근 내 웹 검색에서 Django Haystack (v2.1.0)과 Elasticsearch (v0.90.5)를 검색 엔진으로 사용하여 전체 텍스트 검색을 구현하려고했습니다. 필자의 목표는 하나의 쿼리로 주어진 Song 객체의 제목 필드, 키 라인 필드 및 작성자 필드를 검색 할 수있게하는 것입니다. Django Haystack EdgeNGrams를 Many-to-Many 필드와 함께 사용하는 방법?

from haystack import indexes 
from songs.models import Song 

class SongIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    content_auto = indexes.EdgeNgramField(model_attr='title') 
    content_auto = indexes.EdgeNgramField(model_attr='key_line') 
    authors = indexes.MultiValueField() 
    content_auto = indexes.EdgeNgramField(model_attr='authors') 

    def get_model(self): 
     return Song 

    def prepare_authors(self, object): 
     return [author.last_name for author in object.authors.all()] 

    def index_queryset(self, using=None): 
     return self.get_model().objects.all() 

는 song_text.txt 확실 해요

{{ object.title}} 
{{ object.key_line}} 
{% for author in object.authors.all %} 
    {{ author.last_name}} 
{% endfor %} 

내 search_index.py 몹시 잘못

class Song(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 
    key_line = models.CharField(max_length=300, blank=True) 

    def __unicode__(self): 
     return self.title 

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    middle_name = models.CharField(max_length=30, blank=True) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField(blank=True, verbose_name='e-mail') 

    def __unicode__(self): 
     if self.middle_name: 
      return u'%s %s %s' % (self.first_name, self.middle_name, self.last_name) 
     else: 
      return u'%s %s' % (self.first_name, self.last_name) 

    class Meta: 
     ordering = ('last_name','first_name') 

Search_index.py

Models.py : 여기 내 코드입니다 저자들에게는 필사적이었습니다. 나는 제목과 key_line을 제대로 얻을 수 있었는데, 내가 검색어를 입력하면 제목에 검색어가 있거나 키 라인에 검색어가있는 결과를 얻었습니다. 동일한 테스트를 수행하는 대신 작성자의 성을 쿼리해도 해당 작성자에게 결과가 제공되지 않습니다.

관련 문서의 색인 생성에 대한 정보를 찾았지만 관련된 필드와 관련된 EdgeNGrams 관련 항목을 찾을 수 없었습니다. 가능한가요? 이상 적으로 저자의 이름, 성, 이름을 쿼리 할 수 ​​있기를 원합니다.

미리 도움을 주셔서 감사합니다. 더 자세한 정보가 필요하면 알려주세요.

+0

찾았습니까? – iamkhush

답변

1

비슷한 문제는 귀하의 코드가 있어야한다 Haystack search on a many to many field is not working

def prepare_category(self, obj): 
     return [category.name for category in obj.category_set.all()] 

@ 해결되었습니다;

def prepare_authors(self, object): 
    return [author.last_name for author in object.authors_set.all()] 

song_text.txt를 다음으로 변경하십시오.

{{ object.title}} 
{{ object.key_line}} 
{% for author in object.authors.all %} 
    {{ author.first_name}} 
    {{ author.middle_name}} 
    {{ author.last_name}} 
{% endfor %} 

object.authors.all() object.authors_set.all 로 변경()이 문제를 해결해야한다.

관련 문제