【问题标题】:Searching Pages and custom models at the same time in Wagtail在 Wagtail 中同时搜索页面和自定义模型
【发布时间】:2019-10-03 13:01:23
【问题描述】:

我犯了一个错误 - 在我们的应用程序中将一些模型实现为普通的 Django 模型(但可索引)而不是 Page 模型。

现在客户希望看到一个统一的搜索结果页面(所以分面搜索是不够的)......所以我完全卡住了。

我们正在使用 PostgreSQL 后端。 s.search() 函数需要模型或查询集;并且您不能组合 PostgresSearchResults 查询集。如果我将 2 个结果集转换为列表并将它们组合起来,我将失去结果的相关性。

有什么想法吗?

【问题讨论】:

    标签: django wagtail wagtail-search


    【解决方案1】:

    为了呈现非同质搜索结果,您可以使用:

    from itertools import chain

    假设您搜索了页面、文档、图像,并且还有一些其他结果 - 您可以这样做(包括分页,因为您也需要它):

    page_results = SOME PAGE RESULTS
    doc_results = docs_to_search.search(search_query, order_by_relevance=False)
    img_results = images_to_search.search(search_query, order_by_relevance=False)
    other_search_results = SOME RESULTS FROM SEARCHING MODELS
    
    all_results = list(chain(other_search_results, page_results, img_results, doc_results))
    
    # Pagination
    paginator = Paginator(all_results, items_per_page, orphans=num_orphans)
    try:
        results = paginator.page(page)
    except PageNotAnInteger:
        results = paginator.page(1)
    except EmptyPage:
        results = paginator.page(paginator.num_pages)
    

    然后从您的视图中返回您的results 并使用{% for result in results %} 在模板中呈现

    【讨论】:

    • 总的来说,它非常好 - 但我们希望保持基于相关性的排序,这正是我目前陷入困境的原因。
    • 好的,感谢您的指点,我能够在搜索查询中使用 .annotate_score("_score") 函数和 all_results.sort(key=lambda x: x._score, reverse =True) - 幸运的是只有几百条记录,所以现在就可以了。
    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多