2

追跡しようとしている奇妙な問題が発生しています。複数のモデルにインデックスを付けると、Haystackインデックスからモデルにあるものとは異なる結果が返されます。

最初のテストでは、次のDjangoモデルを定義しています

class Designator(models.Model):
    created_date = models.DateTimeField(default=datetime.now(), blank=False, editable=False)
    modified_date = AutoDateTimeField(blank=True, editable=False)
    created_by = models.ForeignKey(User)
    lastmodified_by = models.ForeignKey(User, blank=True, null=True, related_name="%(app_label)s_%(class)s_related")
    number = models.IntegerField(unique=True)
    description = models.CharField(max_length=50)

このモデルは、このクラスを介してHaystackによってインデックス付けされています

class DesignatorIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    number = indexes.CharField(model_attr='number')
    description = indexes.CharField(model_attr='description')

    def get_model(self):
        return Designator

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(modified_date__lte=datetime.now()).order_by('number')

インデックスを作成した後にDjangoシェルから返される結果は次のとおりです。

>>> from haystack.query import SearchQuerySet
>>> from designator.models import Designator
>>> sqs = SearchQuerySet().models(Designator).filter(text='computer')
>>> sqs.count()
5
>>> for idx, s in enumerate(sqs):
...     print '%s - %s' % (idx, s.text.replace('\n', ' '))
...
0 - 8 COMPUTER MONITOR
1 - 9 COMPUTER PRINTER
2 - 10 COMPUTER CPU
3 - 38 COMPUTER KEYBOARDS
4 - 40 COMPUTER-MISC
>>> d = Designator.objects.filter(description__contains='computer')
>>> d.count()
5
>>> for a in d: print '%s - %s' % (a.number, a.description)
...
8 - COMPUTER MONITOR
9 - COMPUTER PRINTER
10 - COMPUTER CPU
38 - COMPUTER KEYBOARDS
40 - COMPUTER-MISC
>>>

これらの結果は正しいように見えます。インデックスはモデル内の同じデータを返しています。

そこで、インデックスを作成する別のモデルを追加します。この時点でも、すべてのインデックスを完全に再構築します。次のようになります

class Vendor(models.Model):
    created_date = models.DateTimeField(default=datetime.now(), blank=False, editable=False)
    modified_date = AutoDateTimeField(blank=True, editable=False)
    created_by = models.ForeignKey(User)
    lastmodified_by = models.ForeignKey(User, blank=True, null=True, related_name="%(app_label)s_%(class)s_related")
    name = models.CharField(max_length=70)
    street_address = models.CharField(max_length=70, blank=True)
    city = models.CharField(max_length=50, blank=True)
    state = USStateField(blank=True)
    zip = models.CharField(max_length=5, blank=True)
    phone = PhoneNumberField(blank=True)
    email = models.EmailField(blank=True)

class VendorIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(model_attr='name')

    def get_model(self):
        return Vendor

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(modified_date__lte=datetime.now()).order_by('name')

そして今、私のインデックスの結果は少しおかしくなりました。

>>> from haystack.query import SearchQuerySet
>>> from designator.models import Designator
>>> from vendor.models import Vendor
>>> sqs = SearchQuerySet().models(Designator).filter(text='computer')
>>> sqs.count()
5
>>> for idx, s in enumerate(sqs):
...     print '%s - %s' % (idx, s.text.replace('\n', ' '))
...
0 - 8 COMPUTER MONITOR
1 - 9 COMPUTER PRINTER
2 - 8 COMPUTER MONITOR
3 - 9 COMPUTER PRINTER
4 - 8 COMPUTER MONITOR
5 - 9 COMPUTER PRINTER
>>> d = Designator.objects.filter(description__contains='computer')
>>> d.count()
5
>>> for a in d: print '%s - %s' % (a.number, a.description)
...
8 - COMPUTER MONITOR
9 - COMPUTER PRINTER
10 - COMPUTER CPU
38 - COMPUTER KEYBOARDS
40 - COMPUTER-MISC
>>> sqs = SearchQuerySet().models(Vendor).filter(text='computer')
>>> sqs.count()
35
>>> v = Vendor.objects.filter(name__contains='computer')
>>> v.count()
36
>>>

わかりました、それは紛らわしいです。ここで考えられる問題は何ですか?インデックスの設定が間違っていませんか?私のデータの何かが問題を引き起こしている可能性がありますか?ここで何が欠けているのかよくわかりません。

長い投稿で申し訳ありませんが、問題を要約する方法がわかりませんでした。

助けてくれてありがとう、-ジェイ

4

0 に答える 0