gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:46:14 27 4
gpt4 key购买 nike

我最近一直在尝试使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com