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使用正则表达式检测密码强度源码分享
Jun 11 Python
Python使用稀疏矩阵节省内存实例
Jun 27 Python
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
多版本Python共存的配置方法
May 22 Python
深入理解Python3 内置函数大全
Nov 23 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
详解Python 函数参数的拆解
Sep 02 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 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结合飞信 免费天气预报短信
2009/05/07 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
window.open不被拦截的实现代码
2012/08/22 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
python中的yield使用方法
2014/02/11 Python
Python与Redis的连接教程
2015/04/22 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
TensorFlow实现Logistic回归
2018/09/07 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
苹果音乐订阅:Apple Music
2018/08/02 全球购物
C语言笔试题回忆
2015/04/02 面试题
幼儿园保教管理制度
2014/02/03 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书