Django Haystack:通过facet缩小其中的空间并不会缩小

时间:2013-08-20 15:20:31

标签: django elasticsearch django-haystack

我遇到narrowing SearchQuerySet我的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")] 问题,其中有一个空格。

我正在使用django-haystack和ElasticSearch

我有以下索引:

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

我已经成功获得了Wall Tiles的正确值:

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

(这是使用FacetedSearchForm中使用的方法)

但奇怪的是,如果我对地砖使用相同的方法,我仍然会得到所有的瓷砖:

_exact

更奇怪的是,如果我将上面的Wall Tiles查询更改为使用>>> sqs.narrow("category_exact:%s" % sqs.query.clean("Wall Tiles") ).count() 1468 ,它将返回两者的计数!

{{1}}

它适用于没有空格的类别。

我确定我错过了一些基本的东西..但我不能为我的生活看到为什么我得到这样奇怪的结果!

1 个答案:

答案 0 :(得分:0)

您可能需要为category字段设置自定义Elasticsearch分析器。默认分析器对单词进行标记。有关使用Haystack + Elasticsearch自定义事物的一些信息,请参阅http://www.wellfireinteractive.com/blog/custom-haystack-elasticsearch-backend/

您的结果可能会有所不同,但这样的事情是我开始摆脱Haystack并直接使用特定搜索引擎的原因 - 您可以从直接的,非抽象的解决方案中获得更多的灵活性和强大功能