python - 如何在多对多字段中使用 Django Haystack EdgeNGrams?

标签 python django many-to-many elasticsearch django-haystack

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

模型.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')

搜索索引.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()

歌曲文本.txt

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

我确信我的 search_index.py 对作者来说是非常错误的,但我越来越绝望了。我已经能够让标题和 key_line 正常工作,因为如果我输入查询,我得到的结果在标题中有查询或在关键行中有查询。执行相同的测试但查询作者的姓氏不会给我关于该作者的结果。

我已经浏览了文档,虽然我找到了一些关于索引相关字段的信息,但我还没有找到任何与在相关字段中使用 EdgeNGrams 有关的具体信息。这可能吗?理想情况下,我希望能够查询作者的名字、中间名和姓氏。

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

最佳答案

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

关于python - 如何在多对多字段中使用 Django Haystack EdgeNGrams?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19669995/

相关文章:

python - 在 matplotlib 中更改 X(时间,而不是数字)频率的刻度频率

c++ - 在 C++/STL 中是否有与 Python range() 的紧凑等价物

mysql - 3 个表之间的 HQL 多对多

java - 以可联合的顺序 hibernate ManyToMany

python - Flask 应用程序使用 PyInstaller 打包,EXE 中不包含任何模板或静态内容

python - 弹出窗口中的 Kivy 按钮不调用函数

python - 当父模型有多个外键时,Django外键反向访问

javascript - 仅将 Django 用于后端

django - 使用 psycopg2 将 django 与 postgresql 连接起来

java - jpa - 如何创建与 IdClass 的多对多关系?