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创建线程示例
May 06 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python基础知识点 初识Python.md
May 14 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 Python
解决Django连接db遇到的问题
Aug 29 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
Python设计密码强度校验程序
Jul 30 Python
python中的垃圾回收(GC)机制
Sep 21 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
python析构函数用法及注意事项
Jun 22 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
vue-cli如何引入bootstrap工具的方法
2017/10/19 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
Python运行的17个时新手常见错误小结
2012/08/07 Python
Python实现的多线程端口扫描工具分享
2015/01/21 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
python 同时读取多个文件的例子
2019/07/16 Python
python根据文本生成词云图代码实例
2019/11/15 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
综合测评自我鉴定
2013/10/08 职场文书
中学生爱国演讲稿
2013/12/31 职场文书
海飞丝广告词
2014/03/20 职场文书
小学生评语集锦
2014/04/18 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
党校个人总结
2015/03/04 职场文书