2014-11-04 7 views
5

Ich versuche, teilweise Wort Übereinstimmung arbeiten zu bekommen, und ich habe bereits auf related question geschaut, aber aus irgendeinem Grund funktioniert mein Setup nicht. Ich benutze Heuhaufen mit elasticsearch. Kann mir bitte jemand sagen, was ich falsch mache?kann nicht partielle Wortsuche mit Heuhaufen/Elasticsearch

class VendorIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 
    company_name = indexes.CharField(model_attr='company_name', null=True) 

    def get_model(self): 
     return Vendor 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

EDIT: Ich habe diese Arbeit gemacht, indem Sie Autocomplete verwenden. Ich habe jedoch das Gefühl, dass dies ein Hack ist. Aber hier ist mein Code:

class VendorIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    company_name = indexes.CharField(model_attr='company_name', null=True) 
    company_name_auto = indexes.NgramField(model_attr='company_name') 
    def get_model(self): 
     return Vendor 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

dann in der Ansicht:

class SearchVendorView(generics.ListAPIView): 
    serializer_class = serializers.CustomerVendorSerializer 

    def get_queryset(self): 
     results = SearchQuerySet().models(Vendor).autocomplete(company_name_auto=self.request.GET.get('q', '')) 
     vendors = [] 

     for vendor in [result.object for result in results]: 
      vendor.is_liked = Vendor.objects.from_request(self.request).get(pk=vendor.id).user_vote 
      vendors.append(vendor)  

     return vendors 

Antwort

1

In meinem Fall: django-haystack==2.5.1 + elasticsearch==5.0.1 + java elastic search daemon v2.3.1 das ist genug, um Teil-Suche zu erhalten:

from haystack import indexes 
from authors.models import Author 


class AuthorIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 
    last_name = indexes.CharField(model_attr='last_name') 
    first_name = indexes.CharField(model_attr='first_name') 

    def get_model(self): 
     return Author 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

Und dann python manage.py rebuild_index und Sie können suchen nach:

from haystack.query import SearchQuerySet 
SearchQuerySet().filter(content="alex") 

zu finden Alexander.

+0

Wissen Sie, ob dies auf 'elasticsearch 1.x' funktioniert? –

+0

Nathan, Nö, ich benutze nie Elasticsearch v.1. – valex