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实现
Aug 24 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
python装饰器常见使用方法分析
Jun 26 Python
python中pygame安装过程(超级详细)
Aug 04 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
python爬虫爬取笔趣网小说网站过程图解
Nov 18 Python
python数字类型math库原理解析
Mar 02 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基础知识:控制结构
2006/12/13 PHP
php数据库备份还原类分享
2014/03/20 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
python删除过期log文件操作实例解析
2018/01/31 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
python speech模块的使用方法
2020/09/09 Python
Pandas的数据过滤实现
2021/01/15 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
国际经济贸易专业推荐信
2013/11/06 职场文书
座谈会主持词
2014/03/20 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript