2014-11-04 14 views
5

Tôi đang cố gắng thực hiện một phần từ phù hợp và tôi đã xem related question nhưng vì một số lý do thiết lập của tôi không hoạt động. Tôi đang sử dụng haystack với elasticsearch. Ai đó có thể cho tôi biết tôi đang làm gì sai không?không thể tìm kiếm từ một phần để làm việc với haystack/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: Tôi đã thực hiện công việc này bằng cách sử dụng tính năng tự động hoàn tất. Tuy nhiên, tôi cảm thấy như đây là một hack. Nhưng ở đây là mã của tôi:

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() 

sau đó trong Xem:

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 

Trả lời

1

Trong trường hợp của tôi: django-haystack==2.5.1 + elasticsearch==5.0.1 + java elastic search daemon v2.3.1 này là đủ để có được tìm kiếm phần:

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() 

Và sau đó python manage.py rebuild_index và bạn có thể tìm kiếm theo:

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

để tìm Alexander.

+0

Bạn có biết điều này sẽ hoạt động trên 'elasticsearch 1.x' không? –

+0

Nathan, không, tôi không bao giờ sử dụng elasticsearch v.1. – valex

Các vấn đề liên quan