从SOLR查询强制输出以CSV格式下载

时间:2015-07-07 22:28:23

标签: python csv solr flask xls

我将SOLR与Flask(python)包装器一起使用,该包装器通过localhost / HTTP GET进行查询。 Flask然后将结果传递回网络上的用户。我希望能够为用户提供将其查询下载为.csv文件的能力(而不是在浏览器中查看并且必须手动执行)。我也希望能够将csv转换为.xls格式并允许将其作为另一个文件下载。有没有办法让烧瓶缓存文件并提供整体下载,扩展名为(.csv或.xls)?

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

看看这个:http://wiki.apache.org/solr/CSVResponseWriter

Solr不支持xls,但它支持CSV。您可能需要获取下载CSV输出响应的信息

答案 1 :(得分:0)

这是一个hacky,但有效:

一旦我们知道了用户的查询,我们就点击SOLR来获取numFound。 (我无法找到计算方法,如果有更简单的方法,请告诉我?)

接下来,因为我知道标题和结果将始终匹配,所以我只需添加硬编码标题。 (我将在未来的某个日期添加一种方法来解决这个问题。)

然后我们将用户查询从json更改为csv并在根据为返回中的每个页面指定的行计算页面计数后迭代查询结果,并构建final_csv以返回。

最后,我们将final_csv发送回具有Response和相应标头的用户,以便弹出文件下载。

    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