3

私は最近、検索エンジンとして Elasticsearch (v0.90.5) を使用して、Django Haystack (v2.1.0) を使用して webapp に全文検索を実装しようとしています。私の目標は、1 つのクエリで、特定の 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')

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 を使用することに関連する特定の情報は見つかりませんでした。これは可能ですか?理想的には、著者のファーストネーム、ミドルネーム、ラストネームを照会できるようにしたいと考えています。

あなたが与えることができる助けを前もってありがとう!さらに情報が必要な場合はお知らせください。

4

1 に答える 1

1

同様の問題が解決されました @ Haystack 多対多フィールドでの検索が機能しない

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 () に変更すると、この問題が解決するはずです。

于 2016-08-19T10:29:18.543 に答える