2016-04-01 13 views
3

Ich verwende:django-Heuhaufen zur automatischen Vervollständigung funktioniert nicht wie es sollte

  • Django : 1.7.1
  • django-haystack : 2.4.1
  • und elastic search 2.x als Motor

Index Klasse

class WarehouseIndex(SearchIndex, Indexable): 
    """ 
    SearchIndex Class that stored indexes for Model Warehouse 
    """ 
    text = CharField(document=True, use_template=True) 
    search_auto = EdgeNgramField() 
    search_auto2 = NgramField() 
    .... 

    def get_model(self): 
     return WareHouse 

    def prepare(self, obj): 
     self.prepared_data = super(WarehouseIndex, self).prepare(obj) 
     search_auto = [obj.name, obj.sublocality, 
         obj.locality, obj.city] 
     self.prepared_data['search_auto'] = ' '.join(
      [x.lower() for x in search_auto if x is not None]) 
     self.prepared_data['search_auto2'] = ' '.join(
      [x.lower() for x in search_auto if x is not None]) 
     return self.prepared_data 

Ich habe den Index rebuild_index und Ausführen des folgenden Codes in der Schale

>>> from haystack.query import SearchQuerySet, SQ 
>>> sqs = SearchQuerySet().models(WareHouse) 

>>> sqs.filter(search_auto='pond') # query 1 
[] 
>>> sqs.filter(search_auto2='pond') # query 2 
[] 
>>> sqs.filter(search_auto__startswith='pond') # query 3 
[<SearchResult: base.warehouse (pk=u'1')>, <SearchResult: base.warehouse (pk=u'22')> ...] 

>>> sqs.filter(search_auto2__startswith='pond') # # query 4 
[<SearchResult: base.warehouse (pk=u'1')>, <SearchResult: base.warehouse (pk=u'22')> ...] 

bauen, wie Sie Abfrage 1 und 2 gibt „kein Ergebnis“ Abfrage 3 und 4 gibt „gleiche Ergebnis“ sehen können, auch wenn seach_auto und search_auto2 unterscheiden sich beide vom Feldtyp EdgeNgramField und NgramField.

EDIT: Index mapping, Index Setting

EDIT: auf futhere Inspektion bemerkt habe, dass Heuhaufen mein EdgeNgramField und NgramField als CharField behandelt - hier sind die term vectors, beide sind gleiche

EDIT: Bei einer weiteren Inspektion I gefunden haystack/backend/elasticsearch_backend.py wurde stumm Parsen elasticsearch.exceptions.RequestError (full trace here) beim Versuch, die Zuordnung für den Index einzurichten.

Warum wird mein Index nicht ordnungsgemäß erstellt? Was mache ich falsch?

+0

Können Sie die Ausgabe von 'curl -XGET localhost: 9200/your_index' teilen? – Val

+0

@Val - Ich habe einen Link zum Mapping hinzugefügt. – Crazyshezy

+0

Ich müsste auch die Indexeinstellungen sehen. Es sieht jedoch so aus, als ob Ihre Zuordnung grundlegend ist (d. H. Alle Standardtypen) und in Ihren Feldern kein benutzerdefinierter Analysator (Ngram usw.) eingestellt ist. – Val

Antwort

2

Die Sie verknüpft, um tatsächlich einen nützlichen Hinweis zu liefern.

Sie scheinen ES 2.x zu verwenden und Haystack verwendet das _boost Meta-Feld, das has been removed beginnend mit ES 2.0.

Sie können sehen, dass es ein Problem gibt (#1247) über Haystack Arbeit mit ES 2.0 und es ist noch offen.

Was Sie an diesem Punkt tun können, ist entweder ES 1.7.5 statt installieren und es wird funktionieren.

Oder warten Sie, bis the fix in einer neuen Haystack-Version freigegeben wird.

+0

Ja Sobald ich diesen Fehler gefunden habe, konnte ich ihn auch auf das Problem zurückführen, Boost-Meta entfernen und den Index lokal arbeiten lassen, On production wird entweder mit Ihrem Vorschlag oder fork django gehen -haystack und benutze das, bis das Problem gelöst ist. – Crazyshezy

+0

Super, froh, dass es geklappt hat! – Val

+0

Alles andere, was Sie brauchen? – Val

Verwandte Themen