2016-03-10 2 views
1

Я новичок в 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

Я сделал много прибегая к помощи, но не могу найти ответ на этот вопрос.

+0

Есть ли одинаковые значения в поле 'id' в индексе? Есть ли какие-либо поля id вообще? Это, похоже, проблема, когда уникальное поле Key действительно не уникально вообще. – MatsLindh

+0

@MatsLindh Где находится набор уникальных полей? Я думал, что он использовал идентификатор моего объекта «Доктор». Я не вручную устанавливал идентификатор, если это необходимо. Где он установлен? (извините, я новичок в haystack/solr) – lovefaithswing

+0

Он установлен в вашем schema.xml ('id' и' uniqueKey'). Если у вас есть разные значения в столбце 'id' в каждом документе, будет добавлен новый документ. Если документ с тем же значением в поле 'id' существует, он должен быть обновлен (по умолчанию). Поэтому проверьте, что содержит поле 'id' для дубликатов документов. – MatsLindh

ответ

2

Так что это было сложно найти, но проблема была в моей функции index_queryset.

Это:

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

на самом деле должно быть так:

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

Эта функция была дубликатов в ней и вызывает мою ошибку, не Solr схемы, как я думал. Специальность - ManyToManyField.

0

Я просто столкнулся с той же проблемой. В соответствии с этим topic необходимо удалить .pyc файлов. Внутри проекта просто выполните следующий (для Linux):

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