1

我在我的一个项目中运行django-haystack v2.0.0和pyelasticsearch v0.3。我有一个SearchView渲染列表模板,我想集成结果过滤。搜索运行良好,但我使用的过滤器根本不起作用?我使用以下过滤器__contains, __lte__gte但它们似乎都不会对结果列表产生影响。

比如说,我有 10 个SearchView基于搜索词的结果。在同一个模板上,我有一个过滤器表单(使用该GET方法)并调用相同的SearchView. 现在在 SearchView 下,我定义了一个自定义私有_filter_results方法,如下所示。

    def _filter_results(results, filters):
        """  
        This method would return the filtered search results, based on
        the filters applied by a user.
        """

        for item in filters:
            if item == 'location':
                results = results.filter(locations__contains=filters[item])
                print results
            if item == 'age_min':
                results = results.filter(workex_min__gte=filters[item])
            if item == 'age_max':
                results = results.filter(workex_max__lte=filters[item])
        return results

现在,我将结果传递给模板,如下所示:

context {'results' : _filter_results(self.results, self.result_filters)}

self.result_filters是我在SearchView's__call__方法中设置的过滤器字典,它看起来像这样。

{
    'location' : request.GET.get('location'),
    'age_min' : request.GET.get('age_min'),
    'age_max' : request.GET.get('age_max'),
}

我没有收到任何错误,并且我仔细检查了每个过滤器值是否正在传递给该_filter_results方法。但结果仍然保持不变。

如果在 10 个条目的结果列表中,我尝试使用其中没有一个条目包含该位置的位置进行过滤,我仍然会得到相同 10 个条目的结果。可能是什么原因 ?

4

1 回答 1

1

我没有将 Haystack 与 ElasticSearch 一起使用,但在 Solr 中广泛使用它,但它也应该与 ElasticSearch 相同。

您应该使用 results.narrow() 方法而不是过滤器。Filter 方法本质上将在过滤器中附加主要的初始查询词,并在它们之间运行“OR”查询,因为默认运算符在 haystack 中设置为“OR”。

窄() 方法专门用于过滤初始结果集并进一步细化它们,这也有利于使用窄运行过滤查询,因为在搜索引擎中构造的查询是不同的,并且可以更好地利用内置缓存。

def _filter_results(results, filters):
    """  
    This method would return the filtered search results, based on
    the filters applied by a user.
    """

    for item in filters:
        if item == 'location':
            results = results.narrow('locations:%s' % filters[item])
            print results
        if item == 'age_min':
            results = results.narrow('workex_min:[%s TO *]' % filters[item])
        if item == 'age_max':
            results = results.narrow('workex_max:[* TO %s]' % filters[item])
    return results

这也是它与 Solr 一起工作的方式,但是 haystack 方法的概念是相同的,唯一的区别在于每个 SearchEngine 的后端文件。您应该查看 haystack/backends/elasticsearch_backend.py 以获得更好的理解。

也看看 FacetedSearchView 和 FacetedSearchForm

于 2013-01-11T11:21:03.400 回答