我最近一直試圖在我的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相關的字段相關的特定信息。這可能嗎?理想情況下,我希望能夠查詢作者的第一個,中間和最後一個名字。
在此先感謝您的幫助!讓我知道你是否需要更多信息。
你有什麼發現嗎? – iamkhush