强制将 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