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.
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
@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
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