narrowing
我的方面有问题SearchQuerySet
,其中有空间。
我正在使用 django-haystack 和 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 查询更改为 use _exact
,它会返回两者的计数!
>>> sqs.narrow("category_exact:%s" % sqs.query.clean("Wall Tiles") ).count()
1468
它适用于其中没有空格的类别。
我确定我在这里遗漏了一些基本的东西..但我一生都无法理解为什么我会得到如此奇怪的结果!