追跡しようとしている奇妙な問題が発生しています。複数のモデルにインデックスを付けると、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
>>>
わかりました、それは紛らわしいです。ここで考えられる問題は何ですか?インデックスの設定が間違っていませんか?私のデータの何かが問題を引き起こしている可能性がありますか?ここで何が欠けているのかよくわかりません。
長い投稿で申し訳ありませんが、問題を要約する方法がわかりませんでした。
助けてくれてありがとう、-ジェイ