强制将 SOLR 查询的输出下载为 CSV
Force Output from SOLR Query to Download as CSV
我将 SOLR 与 Flask (python) 包装器一起使用,该包装器通过本地主机/HTTP GET 进行查询。 Flask 然后将结果传回给网络上的用户。我希望能够为用户提供将他们的查询下载为 .csv 文件的能力(而不是在浏览器中查看并必须手动执行)。我还希望能够将 csv 转换为 .xls 格式,并允许将其作为另一个文件下载。有没有办法让 flask 缓存文件并将其作为一个整体提供下载,扩展名(.csv 或 .xls)?
感谢您的宝贵时间。
看看这个:http://wiki.apache.org/solr/CSVResponseWriter
Solr 不支持 xls,但支持 CSV。您可能需要获取 flask 才能下载 CSV 输出响应
这是一个 hacky,但有效:
一旦我们知道了用户的查询,我们就可以点击 SOLR 来获取 numFound。 (我找不到方法来计算,如果有更简单的方法,请告诉我?)
下一步,因为我知道 header 和结果总是匹配的,所以我只添加硬编码的 header。 (我将添加一种方法,以便在将来以 python 方式从 solr 获取它。)
然后我们将用户查询从 json 更改为 csv 并迭代查询结果,在根据 return 中为每个页面指定的行数计算页面计数后,构建 final_csv 到 return.
最后,我们将 final_csv 与响应和适当的 header 一起发送回用户,以便它作为文件下载弹出。
final_csv = """"""
header = "service_name_and_version,_version_,run_name,baseline_value,added_on,site_id,metric_type,baseline_run_id,service_name,tag_name,url,service_version,change_in_value,id,run_id,run_value,page_id,cryptic_tag_name"
nice_header = header.split(",")
final_csv += str(nice_header)[1:-1]
r = requests.get(solr_query)
solr_return = r.json()
length = solr_return["response"]["numFound"]
#(n + d // 2) // d
print length
pages = ((length + return_count // 2) // return_count) + 1
#print pages
counter = 0
cursor = 0
csv_query = solr_query.replace("&wt=json", "&wt=csv&csv.header=false")
while counter < pages:
iter_query = csv_query + "&rows=" + str(return_count) + "&start=" + str(cursor)
r = requests.get(iter_query)
solr_return = r.text
solr_docs = solr_return.split("\n")
print solr_docs
print len(solr_docs)
for doc in solr_docs[:-1]:
row = str(doc)
split_row = row.split(",")
final_csv += "\n" + str(split_row)[1:-1]
counter += 1
cursor += return_count
response = make_response(final_csv)
response.headers['Content-type'] = 'text/csv'
response.headers["Content-Disposition"] = "attachment; filename={0}.csv".format(csv_name)
return response
我将 SOLR 与 Flask (python) 包装器一起使用,该包装器通过本地主机/HTTP GET 进行查询。 Flask 然后将结果传回给网络上的用户。我希望能够为用户提供将他们的查询下载为 .csv 文件的能力(而不是在浏览器中查看并必须手动执行)。我还希望能够将 csv 转换为 .xls 格式,并允许将其作为另一个文件下载。有没有办法让 flask 缓存文件并将其作为一个整体提供下载,扩展名(.csv 或 .xls)?
感谢您的宝贵时间。
看看这个:http://wiki.apache.org/solr/CSVResponseWriter
Solr 不支持 xls,但支持 CSV。您可能需要获取 flask 才能下载 CSV 输出响应
这是一个 hacky,但有效:
一旦我们知道了用户的查询,我们就可以点击 SOLR 来获取 numFound。 (我找不到方法来计算,如果有更简单的方法,请告诉我?)
下一步,因为我知道 header 和结果总是匹配的,所以我只添加硬编码的 header。 (我将添加一种方法,以便在将来以 python 方式从 solr 获取它。)
然后我们将用户查询从 json 更改为 csv 并迭代查询结果,在根据 return 中为每个页面指定的行数计算页面计数后,构建 final_csv 到 return.
最后,我们将 final_csv 与响应和适当的 header 一起发送回用户,以便它作为文件下载弹出。
final_csv = """"""
header = "service_name_and_version,_version_,run_name,baseline_value,added_on,site_id,metric_type,baseline_run_id,service_name,tag_name,url,service_version,change_in_value,id,run_id,run_value,page_id,cryptic_tag_name"
nice_header = header.split(",")
final_csv += str(nice_header)[1:-1]
r = requests.get(solr_query)
solr_return = r.json()
length = solr_return["response"]["numFound"]
#(n + d // 2) // d
print length
pages = ((length + return_count // 2) // return_count) + 1
#print pages
counter = 0
cursor = 0
csv_query = solr_query.replace("&wt=json", "&wt=csv&csv.header=false")
while counter < pages:
iter_query = csv_query + "&rows=" + str(return_count) + "&start=" + str(cursor)
r = requests.get(iter_query)
solr_return = r.text
solr_docs = solr_return.split("\n")
print solr_docs
print len(solr_docs)
for doc in solr_docs[:-1]:
row = str(doc)
split_row = row.split(",")
final_csv += "\n" + str(split_row)[1:-1]
counter += 1
cursor += return_count
response = make_response(final_csv)
response.headers['Content-type'] = 'text/csv'
response.headers["Content-Disposition"] = "attachment; filename={0}.csv".format(csv_name)
return response