2014-11-04 89 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