Я новичок в haystack/solr, так что это, скорее всего, ошибка новичка. Я использую solr с haystack.Haystack + solr duplicate on update
Когда я запускаю update_index, он, похоже, дублирует записи. Я получаю:
get() returned more than one Doctor -- it returned 3!
за этот кусок кода:
self._object = self.searchindex.read_queryset().get(pk=self.pk)
если я бегу update_index снова, Возвратный номер увеличивается на единицу, и если я бегу rebuild_index, он будет работать, показывая только одну запись до Я снова обновляюсь.
Итак, кажется, что update_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)
Вот моя схема Solr: https://gist.github.com/anonymous/5d5b011ca7fa0f3f3e29
Я сделал много прибегая к помощи, но не могу найти ответ на этот вопрос.
Есть ли одинаковые значения в поле 'id' в индексе? Есть ли какие-либо поля id вообще? Это, похоже, проблема, когда уникальное поле Key действительно не уникально вообще. – MatsLindh
@MatsLindh Где находится набор уникальных полей? Я думал, что он использовал идентификатор моего объекта «Доктор». Я не вручную устанавливал идентификатор, если это необходимо. Где он установлен? (извините, я новичок в haystack/solr) – lovefaithswing
Он установлен в вашем schema.xml ('id' и' uniqueKey'). Если у вас есть разные значения в столбце 'id' в каждом документе, будет добавлен новый документ. Если документ с тем же значением в поле 'id' существует, он должен быть обновлен (по умолчанию). Поэтому проверьте, что содержит поле 'id' для дубликатов документов. – MatsLindh