首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高Django-PostgreSQL搜索性能并提高HTML呈现或AJAX响应速度?

如何提高Django-PostgreSQL搜索性能并提高HTML呈现或AJAX响应速度?
EN

Stack Overflow用户
提问于 2021-03-07 01:25:17
回答 1查看 239关注 0票数 1

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

我使用jquery 调用将搜索查询从UI发送到django views.py,在执行搜索、筛选和命令操作之后,我使用DTL呈现不同的views.py以及结果查询集。views.py函数内部的执行时间约为0.5秒,但ajax调用和响应期间的总时间约为5-6秒。

请参阅我的代码如下:

VIEWS.PY

代码语言:javascript
复制
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

代码语言:javascript
复制
{% for i in result_set %}
                        <tr>
                            <td>{{ i.report_name }}</td>
                            <td>{{ i.tool }}</td>
                            <td>{{ i.owner }}</td>
                        </tr>
{% endfor %}

主页和AJAX

代码语言:javascript
复制
<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呼叫响应速度。

我将非常感谢您的帮助。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-03-07 16:36:58

不要在服务器端呈现数据,而是以JSON的形式发送数据,并在客户端呈现数据。

更好的是,您可以使用reactive来发送JSON流,而不是JSON (万一result_set非常大)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66512366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档