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矩阵常见运算操作实例总结
Sep 29 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
Python命令行解析模块详解
Feb 01 Python
python合并同类型excel表格的方法
Apr 01 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
django实现类似触发器的功能
Nov 15 Python
Pycharm小白级简单使用教程
Jan 08 Python
python爬取本站电子书信息并入库的实现代码
Jan 20 Python
Python如何实现线程间通信
Jul 30 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 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
Content-type 的说明
2006/10/09 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
php去掉文件前几行的方法
2015/07/29 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
PHP new static 和 new self详解
2017/02/19 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python语言的变量认识及操作方法
2018/02/11 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
医生实习工作总结的自我评价
2013/09/27 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
励志演讲稿200字
2014/08/21 职场文书
三年级学生评语大全
2014/12/26 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server