2013-10-29 22 views
3

我最近一直試圖在我的webapp上用Django Haystack(v2.1.0)和Elasticsearch(v0.90.5)作爲我的搜索引擎來實現全文搜索。我的目標是通過一個查詢,能夠搜索給定歌曲對象的標題字段,關鍵字段字段和作者字段。這裏是我的代碼:如何使用Django Haystack EdgeNGrams與多對多字段?

Models.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

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是極其錯誤的對於作者而言,我變得絕望了。我已經能夠讓標題和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()應該解決這個問題。

相關問題