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多进程编程
Jun 12 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
对python中类的继承与方法重写介绍
Jan 20 Python
用Python逐行分析文件方法
Jan 28 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python实现点击按钮修改数据的方法
Jul 17 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 Python
聊一聊python常用的编程模块
May 14 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
Python 监测文件是否更新的方法
2019/06/10 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
python实现一个猜拳游戏
2020/04/05 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
python中常见错误及解决方法
2020/06/21 Python
html5开发之viewport使用
2013/10/17 HTML / CSS
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
应用电子专业学生的自我评价
2013/10/16 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
销售经理竞聘书
2014/03/31 职场文书
小学生综合素质评语
2014/04/23 职场文书
初一军训感言
2015/08/01 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python