【问题标题】:How to improve Django-PostgreSQL search performance and increase HTML rendering or AJAX response speed?如何提高 Django-PostgreSQL 搜索性能并提高 HTML 渲染或 AJAX 响应速度?
【发布时间】:2021-06-05 07:17:54
【问题描述】:

我正在使用 postgreSQL 在 django 中开发一个全文搜索应用程序,其中数据库目前大约有 50k 行。我正在使用 SearchRankTrigramSimilarity 并且已经实现了 SearchVectorFieldGIN 索引,但搜索结果仍然存在5-10 秒根据搜索复杂性显示在屏幕上。

我正在使用 jquery ajax 调用将搜索查询从 UI 发送到 django views.py,在执行搜索、过滤和排序操作后,我正在渲染不同的 HTML 以及结果查询集使用 DTLviews.py 函数内部的执行时间约为 0.5 秒,但 ajax 调用和响应期间所用的总时间约为 5-6 秒。

请看我下面的代码:

VIEWS.PY

start_time = time.time()

search_query = SearchQuery(query)
rank = SearchRank('search_vector', search_query, weights=[0.2, 0.4, 0.6, 0.8])
trigram = (TrigramSimilarity('report_name', query_trigram) + TrigramSimilarity('tool', query_trigram) + TrigramSimilarity('owner', query_trigram)

result_set = BI_Report.objects.annotate(rank=rank, trigram=trigram, total=rank+trigram).order_by('-total').filter(Q(trigram__gt=0.2) | Q(rank__gt=0.1))[:50]

time_taken = time.time() - start_time

return render(request, 'display.html', {"result_set": result_set, 'query':query})

time_taken = 0.45 秒

GIN 索引存在于 SearchVectorField 和其他数据库字段中,并且在 postgres 中运行 SQL 时显示位图堆扫描。在我的代码中,使用 .explain() 我可以看到 SearchRank 正在对搜索向量字段进行索引扫描,但 TrigramSimilarity 正在执行并行 seq 扫描。

显示 HTML

{% for i in result_set %}
                        <tr>
                            <td>{{ i.report_name }}</td>
                            <td>{{ i.tool }}</td>
                            <td>{{ i.owner }}</td>
                        </tr>
{% endfor %}

主页和 AJAX

<div id='result'></div>
<script>
            var starttime = new Date();
            $.ajax({
                type: "GET",
                url: "display/",
                headers: {"key" : query},
                success: function(responseData) {
                        document.getElementById('result').innerHTML = responseData;
                        total_time = new Date() - starttime;
                        console.log(total_time)
                    }
                },
            });
</script>

total_time = 5800 毫秒

我将请求标头中的搜索查询传递给 views.py 函数,并使用 document.getElementById.innerhtml 显示呈现的 html 和所有结果。

我不确定是什么导致了延迟 - 是搜索操作本身还是渲染/ajax 调用? 我想在 2 秒内将搜索结果显示在屏幕上。请建议我可以通过什么方式来提高搜索操作速度并提高 ajax 调用响应速度。

如果有任何帮助,我将不胜感激。谢谢!

【问题讨论】:

    标签: django ajax performance full-text-search django-postgresql


    【解决方案1】:

    不要在服务器端呈现,而是以 JSON 格式发送数据,然后在客户端呈现。

    更好的是,您可以使用响应式 API 发送 JSON 流而不是 JSON(以防 result_set 非常大)。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 2020-12-24
      • 2014-12-08
      • 1970-01-01
      • 2016-11-17
      相关资源
      最近更新 更多