2013-08-01 13 views
8

Es sieht so aus, als ob elasticsearch Fuzzy-Abfragen unterstützt (http://www.elasticsearch.org/guide/reference/query-dsl/fuzzy-query/), aber ich kann keinen Weg finden, Django-Heuhaufen in dieser Option zu haben.Wie kann ich eine Fuzzy-Suche mit Django-Heuhaufen und dem Elasticsearch-Backend durchführen?

Ich habe in die Django-Heuhaufen-Suche gegraben und es sieht so aus, als ob es die 'match_all'-Abfrage verwendet, wenn das Elasticsearch-Backend verwendet wird. Ist es möglich, das Fuzzy-Match-Verhalten zu erhalten, ohne den Django-Heuhaufen-Quellcode modifizieren zu müssen?

Haystack Quelle: https://github.com/toastdriven/django-haystack/blob/master/haystack/backends/elasticsearch_backend.py (die build_search_kwargs Methode ist das, was ich vermute, ich ändern müssen)

+0

Dan, hast du Fortschritte dabei gemacht? – Alp

+1

@Alp - Ja. Am Ende habe ich Bennylopes Vorschlag verwendet, obwohl ich ziemlich viel Zeit brauchte, um herauszufinden, wie man die Anfrage strukturiert und welchen Endpunkt man eingibt. Ich stellte dann fest, dass es nicht so konfigurierbar war, wie ich es wollte, also ging ich ein paar Schritte zurück und holte mir einen größeren Satz von Suchergebnissen zurück und durchlief sie dann mit meinem eigenen "unscharfen" Algorithmus. –

Antwort

6

Keine Notwendigkeit Heuhaufen gabeln, können Sie diese Methode in Ihrem eigenen Backend-Update (für weitere Informationen siehe Stretching Haystack's ElasticSearch Backend). Die build_search_kwargs-Methode gibt ein Dictionary zurück, sodass Sie nur den ursprünglichen Rückgabewert ändern können.

Haftungsausschluss: Dieser Code ist nur ein Beispiel dafür, wie Sie Ihre eigene Backend aktualisieren konnten, nicht wie Fuzzy-Suche zu implementieren.

class FuzzyBackend(ElasticsearchSearchBackend): 
    def build_search_kwargs(self, query_string, **kwargs): 
     fuzzy = kwargs.pop('fuzzy', False) 
     fuzzy_field = kwargs.pop('min_similarity', '') 
     search_kwargs = super(FuzzyBackend, self).build_search_kwargs(
       query_string, kwargs) 
     if fuzzy: 
      search_kwargs = {'fuzzy': {fuzzy_field: query_string}} 
     return search_kwargs 
+1

Das ist ein guter Ansatz - vielen Dank, dass Sie es vorgeschlagen haben. Ich werde versuchen, es zu integrieren und Sie wissen zu lassen, wie es geht. –

Verwandte Themen