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字符串拼接、截取及替换方法总结分析
Apr 13 Python
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
Python随机函数random()使用方法小结
Apr 29 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
如何基于windows实现python定时爬虫
May 01 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
python中return如何写
Jun 18 Python
python 利用 PIL 将数组值转成图片的实现
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截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
python实现简单中文词频统计示例
2017/11/08 Python
速记Python布尔值
2017/11/09 Python
Python实现端口检测的方法
2018/07/24 Python
Python切片操作深入详解
2018/07/27 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
美国校服网上商店:French Toast
2019/10/08 全球购物
中软Java笔试题
2012/11/11 面试题
社区国庆节活动方案
2014/02/05 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
委托书格式
2014/08/01 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
2014年采购部工作总结
2014/11/20 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python