我遇到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}}
它适用于没有空格的类别。
我确定我错过了一些基本的东西..但我不能为我的生活看到为什么我得到这样奇怪的结果!
答案 0 :(得分:0)
您可能需要为category
字段设置自定义Elasticsearch分析器。默认分析器对单词进行标记。有关使用Haystack + Elasticsearch自定义事物的一些信息,请参阅http://www.wellfireinteractive.com/blog/custom-haystack-elasticsearch-backend/。
您的结果可能会有所不同,但这样的事情是我开始摆脱Haystack并直接使用特定搜索引擎的原因 - 您可以从直接的,非抽象的解决方案中获得更多的灵活性和强大功能