1

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

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

我确定我在这里遗漏了一些基本的东西..但我一生都无法理解为什么我会得到如此奇怪的结果!

4

1 回答 1

0

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

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

于 2013-08-20T16:19:18.430 回答