2013-08-20 68 views
1

我遇到問題narrowing我的SearchQuerySet方面有空間。Django Haystack:縮小方面的空間不縮小

我使用Django的草垛與ElasticSearch

我有以下指標:

class ProductIndex(indexes.SearchIndex, indexes.Indexable): 

    text = indexes.CharField(document=True, use_template=True) 
    title = indexes.CharField(model_attr='title') 

    category = indexes.MultiValueField(faceted=True) # m2m field 
    weight = indexes.MultiValueField(faceted=True, null=True) 
    title_auto = indexes.EdgeNgramField(model_attr='title') # for autocomplete 

def get_model(self): 
    return Product 

def prepare_category(self, obj): 
    return [(cat.title) for cat in obj.categories.all()] 

def prepare_weight(self, obj): 
    return [(meta.value) for meta in obj.productmeta_set.filter(label="weight")] 

但是,試圖對其進行查詢時,我得到了一些非常奇怪的結果:

總方面計數:

>>> sqs = SearchQuerySet().all().facet("category") 
>>> sqs.facet_counts() 
{'fields': {'category': [(u'Wall Tiles', 1028), (u'Floor Tiles', 440), (u'Baths', 49), (u'Basins', 25), (u'Toilets', 19)]}, 'dates': {}, 'queries': {}} 

我設法得到了正確的值對於牆磚,像這樣:

>>> sqs.narrow("category:%s" % sqs.query.clean("Wall Tiles")).count() 
1028 # correct value 

(這是用在FacetedSearchForm使用的方法)

但奇怪的是,如果我使用的地磚同樣的方法我仍然得到所有的瓷磚:

>>> sqs.narrow("category:%s" % sqs.query.clean("Floor Tiles")).count() 
1468 # incorrect (count of floor tiles + wall tiles) 

更奇怪的是,如果我將上面的Wall Tiles查詢更改爲使用_exact,它將返回兩者的數量!

>>> sqs.narrow("category_exact:%s" % sqs.query.clean("Wall Tiles")).count() 
1468 

它適用於沒有空間的類別。

我確定我在這裏錯過了一些基本的東西..但是我不能爲我的生活看到爲什麼我會得到這樣奇怪的結果!

回答

0

您可能需要爲您的category字段設置自定義Elasticsearch分析器。默認分析器對單詞進行標記。請參閱http://www.wellfireinteractive.com/blog/custom-haystack-elasticsearch-backend/瞭解使用Haystack + Elasticsearch自定義事物的一些信息。

您的結果可能會有所不同,但類似的情況是我已經開始擺脫Haystack並直接使用特定搜索引擎的原因 - 您可以從直接,非抽象的角度獲得更多的靈活性和權力解。

+0

我打算把這個標記爲答案,儘管我最終採取了不同的方法。這是一個更正確的方法。 我所做的就是在'_prepare()'方法中對我的分面字段進行'slugify'。然後我添加了一個'deslugify'模板標籤來處理前端中各個方面的顯示。 – toast38coza