【发布时间】:2021-06-05 07:17:54
【问题描述】:
我正在使用 postgreSQL 在 django 中开发一个全文搜索应用程序,其中数据库目前大约有 50k 行。我正在使用 SearchRank 和 TrigramSimilarity 并且已经实现了 SearchVectorField 和 GIN 索引,但搜索结果仍然存在5-10 秒根据搜索复杂性显示在屏幕上。
我正在使用 jquery ajax 调用将搜索查询从 UI 发送到 django views.py,在执行搜索、过滤和排序操作后,我正在渲染不同的 HTML 以及结果查询集使用 DTL。 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 调用响应速度。
如果有任何帮助,我将不胜感激。谢谢!
【问题讨论】:
标签: django ajax performance full-text-search django-postgresql