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中使用smtplib和email模块发送邮件实例
Apr 22 Python
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
python中查看变量内存地址的方法
May 05 Python
python实现自动更换ip的方法
May 05 Python
浅谈python numpy中nonzero()的用法
Apr 02 Python
实例讲解Python爬取网页数据
Jul 08 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
js a标签点击事件
2017/03/30 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
selenium+python实现自动登录脚本
2018/04/22 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Django URL参数Template反向解析
2020/11/24 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
Java提供了哪些企业应用编程接口
2015/02/13 面试题
介绍一下gcc特性
2015/10/31 面试题
教师节促销活动方案
2014/02/14 职场文书
自主招生教师推荐信
2014/05/10 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
论文答谢词
2015/01/20 职场文书
创业计划书之书店
2019/09/10 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android