我正在使用postgreSQL在django中开发一个全文搜索应用程序,其中数据库目前有大约50k行。我正在使用TrigramSimilarity和SearchRank,并且已经实现了SearchVectorField和GIN索引,但是搜索结果仍然需要5-10秒才能在屏幕上显示,这取决于搜索的复杂性。
我使用jquery 调用将搜索查询从UI发送到django views.py,在执行搜索、筛选和命令操作之后,我使用DTL呈现不同的views.py以及结果查询集。views.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呼叫响应速度。
我将非常感谢您的帮助。谢谢!
发布于 2021-03-07 16:36:58
不要在服务器端呈现数据,而是以JSON的形式发送数据,并在客户端呈现数据。
更好的是,您可以使用reactive来发送JSON流,而不是JSON (万一result_set非常大)。
https://stackoverflow.com/questions/66512366
复制相似问题