2014-11-04 54 views
5

我試圖讓部分詞語匹配工作,並且我已經查看了related question但由於某種原因,我的設置無法正常工作。我正在用elasticsearch使用haystack。有人可以告訴我我做錯了什麼嗎?無法通過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() 

編輯:我做了這項工作,利用自動完成。但是,我覺得這是一個破解。但這裏是我的代碼:

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

然後在視圖:

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 

回答

1

在我的情況:django-haystack==2.5.1 + elasticsearch==5.0.1 + java elastic search daemon v2.3.1這是足以讓部分搜索:

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

而且然後python manage.py rebuild_index,你可以搜索:

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

找到Alexander

+0

你知道這是否適用於'elasticsearch 1.x'嗎? – 2016-12-08 17:54:40

+0

彌敦道,不,我從來沒有用elasticsearch v.1。 – valex 2016-12-09 12:12:26