通过django_id过滤干草堆(SOLR)结果

时间:2015-06-30 13:08:59

标签: django-haystack

使用Django / Haystack / SOLR,我希望能够将搜索结果限制在特定django_ids范围内的记录中。获取这些ID不是问题,但尝试通过它们进行过滤会产生一些意想不到的效果。代码看起来像这样(为了清晰起见,修剪了无关的代码):

def view_results(request,arg):
    # django_ids list is first calculated using arg...
    sqs = SearchQuerySet().facet('example_facet') # STEP_1
    sqs = sqs.filter(django_id__in=django_ids) # STEP_2

    view = search_view_factory(
        view_class=SearchView,
        template='search/search-results.html',
        searchqueryset=sqs,
        form_class=FacetedSearchForm
    )

    return view(request)

在标记为STEP_1的点上,我获得了所有数据库记录。在STEP_2,记录成功地缩小到对于django_ids列表所期望的数字I。如果在用户在表单中指定了搜索词的情况下显示搜索结果,则会出现问题。我不是从STEP_2中返回与该术语匹配的所有记录,而是从STEP_2中获取所有来自STEP_1的记录,这些记录与该术语匹配。

因此,据推测,我需要在haystack / views.py中覆盖SearchView中的一个/一些方法,但是什么呢?任何人都可以提出实现这里所需要的方法吗?

1 个答案:

答案 0 :(得分:0)

经过一番思考后,我找到了解决方法。在上面的代码中,问题发生在view = search_view_factory...行,所以我需要创建自己的SearchView类并覆盖get_results(self)方法,以便在搜索运行后应用过滤用户的搜索字词。结果是这些代码:

class MySearchView(SearchView):

    def get_results(self):
        search = self.form.search()
        # The ID I need for the database search is at the end of the URL,
        # but this may have some search parameters on and need cleaning up.
        view_id = self.request.path.split("/")[-1]
        view_query = MyView.objects.filter(id=view_id.split("&")[0])

        # At this point the django_ids of the required objects can be found.
        if len(view_query) > 0:
            view_item = view_query.__getitem__(0)
            django_ids = []
            for thing in view_item.things.all():
               django_ids.append(thing.id)
            search = search.filter_and(django_id__in=django_ids)
        return search

最后使用search.filter_and而不是search.filter是另一件事,结果证明是必不可少的,但在进行过滤之前,我没有做过滤所需要的事情。搜索查看。