如何使用 Django Haystack EdgeNGrams with Many-to-More 字段



我最近一直在尝试使用Django Haystack(v2.1.0)和Elasticsearch(v0.90.5)作为我的搜索引擎在我的Web应用程序上实现全文搜索。我的目标是能够通过一个查询在标题字段、关键行字段和作者字段中搜索给定的 Song 对象。这是我的代码:

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 相关的任何具体内容。这可能做到吗?理想情况下,我希望能够查询作者的名字、中间名和姓氏。

提前感谢您提供的任何帮助!如果您需要更多信息,请告诉我。

解决了类似的问题@ 多对多字段的干草堆搜索不起作用

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() 应该可以解决这个问题。

相关内容

最新更新