python 动态迁移solr数据过程解析


Posted in Python onSeptember 04, 2019

前言

上项目的时候,遇见一次需求,需要把在线的 其中一个 collection 里面的数据迁移到另外一个collection下,于是就百度了看到好多文章,其中大部分都是使用导入的方法,没有找到在线数据的迁移方法。于是写了python脚本,分享出来。

思路: collection数据量比较大,所以一次性操作所有数据太大,于是分段执行操作。

先分段 按1000条数据量进行查询,处理成json数据

把处理后的json数据 发送到目的collection上即可

实现:

一、使用http的接口先进行查询

使用如下格式查询:

其中:collection_name 是你查询的collection的名称

rows 是需要查询多少行,这里设置为1000

start 从多少行开始进行查询,待会儿脚本里面就是控制这个参数进行循环查询

http://host:port/solr/collection_name/select?q=*:*&rows=1000&start=0

查询处理后会得到如下图片里面的数据格式,其中

在response里面,有两个键值数据是我们需要的,一个是numFound(总的数据条数),docs(所有json数据都在这里面)

python 动态迁移solr数据过程解析

在docs里面,每条数据都带有version 键值,这个需要给去掉

python 动态迁移solr数据过程解析

二、使用http的接口提交数据

wt:使用json格式提交

http://host:port/solr/collection_name/update?wt=json

header 需设置为 {"Content-Type": "application/json"}

提交参数:solr在做索引的时候,如果文档已经存在,就替换。(这里的参数也可以直接加到url里面)

{"overwrite":"true","commit":"true"}

data_dict 就是我们处理后的 docs数据

提交数据:data={"add":{ "doc":data_dict}}

三、实现的脚本如下:

#coding=utf-8
import requests as r
import json
import threading
import time
#发送数据到目的url des_url,data_dict 参数为去掉version键值后的一条字典数据
def send_data(des_url,data_dict):
 data={"add":{ "doc":data_dict}}
 headers = {"Content-Type": "application/json"}
 params = {"boost":1.0,"overwrite":"true","&commitWithin":1000,"commit":"true"}
 url = "%s/update?wt=json"%(des_url)
 re = r.post(url,json = data,params=params,headers=headers)
 if re.status_code != 200:
  print("导入出错",data)

#获取数据,调用send_data 发送数据到目的url
def get_data(des_url,src_url):
  #定义起始行
 start = 0
 #先获取到总的数据条数
 se_data=r.get("%s/select?q=*:*&rows=0&start=%s"%(src_url,start)).text
 se_dict = json.loads(se_data)
 numFound = int(se_dict["response"]["numFound"])
 #while循环,1000条数据为一个循环
 while start < numFound:
  #定义存放多线程的列表
  th_li = []
    #获取1000条数据
  se_data=r.get("%s/select?q=*:*&rows=1000&start=%s"%(src_url,start)).text
    #把获取的数据转换成字典
  se_dict = json.loads(se_data)
    #获取数据里的docs数据
  s_data = (se_dict["response"]["docs"])

  #循环得到的数据,删除 version键值,并使用多线程调用send_data 方法发送数据
  for i in s_data:
   del i["_version_"]
   th = threading.Thread(target=send_data,args=(des_url,i))
   th_li.append(th)

  for t in th_li:
   t.start()
   t.join()

  start += 1000
  print(start)

if __name__ == "__main__":
 #源数据,查询数据的collection地址
 src_url = "http://ip:port/solr/src_connection"
 #导入数据导目的collection 的地址
 des_url = "http://ip:port/solr/des_connection"
 start_time = time.time()
 get_data(des_url,src_url)
 end_time = time.time()
 print("耗时:",end_time-start_time,"秒")

备注:

一、如果你的collection 不在同一个网络,不能实现在线传输,可以先把for循环 删除了version键值的数据,写入一个文件中,然后copy到目的网络的服务器上,循环读取文件进行上传,如下写入文件(这个就根据各位大佬的喜好来写了),但读取后,需要把每一条数据都转换成字典进行上传:

file = open("solr.json","a+")
for i in s_data:
del i["version"]
file.write(str(i)+"\n")
file.close()

二、清除数据可使用一下方法,自测比较方便的一种

在你要清除collection里面

选择 documents

document type 选择xml

将一下内容复制到如图位置,最后点击submit document 按钮即可

#控制web界面删除数据
<delete><query>:</query></delete>
<commit/>

python 动态迁移solr数据过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单谈谈Python中的闭包
Nov 30 Python
简单谈谈Python流程控制语句
Dec 04 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
tensorflow实现逻辑回归模型
Sep 08 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
django 邮件发送模块smtp使用详解
Jul 22 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
python实现语音常用度量方法的代码详解
May 25 Python
详解python的异常捕获
Mar 03 Python
Django框架 信号调度原理解析
Sep 04 #Python
Django Admin中增加导出Excel功能过程解析
Sep 04 #Python
Django Admin中增加导出CSV功能过程解析
Sep 04 #Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 #Python
通过Python编写一个简单登录功能过程解析
Sep 04 #Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 #Python
python3实现微型的web服务器
Sep 03 #Python
You might like
php实现比较全的数据库操作类
2015/06/18 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
Node 代理访问的实现
2019/09/19 Javascript
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python读写unicode文件的方法
2015/07/10 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
Python数据可视化之画图
2019/01/15 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
英国精品买手店:Browns Fashion
2016/09/29 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
房地产销售计划书
2014/01/10 职场文书
初中音乐教学反思
2014/01/12 职场文书
公证委托书模板
2014/04/03 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
《静夜思》教学反思
2016/02/17 职场文书
导游词之无锡古运河
2019/11/14 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
python 详解turtle画爱心代码
2022/02/15 Python