2016-03-10 3 views
1

Je suis nouveau à haystack/solr donc c'est probablement une erreur de débutant. J'utilise solr avec haystack. Lorsque j'exécute update_index, il semble que je duplique les enregistrements. Je reçois:Haystack + solr dupliquer sur la mise à jour

get() returned more than one Doctor -- it returned 3! 

pour ce morceau de code:

self._object = self.searchindex.read_queryset().get(pk=self.pk) 

si je lance update_index à nouveau, le retour du nombre augmente par un et si je cours rebuild_index, il ne fonctionnera montrant qu'un seul enregistrement jusqu'à ce que Je mets à jour encore. Donc, à partir de là, il semble que update_index duplique les enregistrements dans l'index. Comment puis-je l'obtenir de ne pas faire ça?

Voici ma recherche botte de foin index:

from haystack import indexes 
from .models import Doctor, Zipcode 
from django.contrib.gis.measure import D 
from django.conf import settings 

class DoctorIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 
    name = indexes.EdgeNgramField(model_attr='name') 
    specialty = indexes.MultiValueField() 
    condition = indexes.MultiValueField() 
    procedure = indexes.MultiValueField() 
    premium = indexes.BooleanField() 
    location = indexes.LocationField(model_attr='main_office__location') 

    latitude = indexes.DecimalField(indexed=False) 
    longitude = indexes.DecimalField(indexed=False) 
    docid = indexes.IntegerField() 
    slugify_name = indexes.CharField(indexed=False) 
    rendered = indexes.CharField(use_template=True, indexed=False) 
    premium_rendered = indexes.CharField(use_template=True, indexed=False) 
    include = indexes.BooleanField(indexed=False) 

    def get_model(self): 
     return Doctor 

    def prepare_specialty(self, obj): 
     return ["%s %s"%((specialty.parent.name if specialty.parent else ""), specialty.name) for specialty in obj.specialty.all()] 

    def prepare_condition(self, obj): 
     return [condition.name for condition in obj.conditions.all()] 

    def prepare_procedure(self, obj): 
     return [procedure.name for procedure in obj.procedures.all()] 

    def prepare_premium(self, obj): 
     return obj.display()['premium'] 

    def prepare_latitude(self, obj): 
     return obj.main_office.lat 

    def prepare_longitude(self, obj): 
     return obj.main_office.lon 

    def prepare_docid(self,obj): 
     return obj.id 

    def prepare_slugify_name(self,obj): 
     return obj.slugify_name() 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.filter(specialty__search_include=True) 

Voici mon schéma Solr: https://gist.github.com/anonymous/5d5b011ca7fa0f3f3e29

Je l'ai fait beaucoup de googler, mais ne peut pas sembler trouver une réponse à cette question.

+0

Y a-t-il des valeurs identiques dans le champ 'id' de l'index? Y a-t-il des champs d'identification ajoutés? Cela semble être un problème où le champ uniqueKey n'est pas du tout unique. – MatsLindh

+0

@MatsLindh Où est le champ uniquekey? Je pensais qu'il utilisait l'identifiant de mon objet Docteur. Je n'ai pas défini manuellement un identifiant si cela est nécessaire. Où est-ce que ça se passe? (désolé, je suis tout nouveau à haystack/solr) – lovefaithswing

+0

Il est défini dans votre fichier schema.xml ('id' et' uniqueKey'). Si vous avez des valeurs distinctes dans la colonne 'id' de chaque document, un nouveau document sera ajouté. Si un document avec la même valeur dans le champ 'id' existe, il doit être mis à jour à la place (par défaut). Vérifiez donc ce que contient le champ 'id' pour les documents en double. – MatsLindh

Répondre

2

Donc, celui-ci était difficile à traquer, mais le problème était en fait dans ma fonction index_queryset.

Ce:

return self.get_model().objects.filter(specialty__search_include=True) 

devrait effectivement être ceci:

return self.get_model().objects.filter(specialty__search_include=True).distinct() 

Cette fonction avait des doublons dans et était à l'origine de mon erreur, pas le schéma Solr comme je l'avais pensé. La spécialité est un ManyToManyField.

0

Je viens de faire face au même problème. Selon ce topic il est nécessaire d'enlever .pyc fichiers. A l'intérieur d'un projet, faites simplement le suivant (pour Linux):

find . -name "*.pyc" -type f -delete