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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
Numpy数组转置的两种实现方法
Apr 17 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
详解Python3 pickle模块用法
Sep 16 Python
Python函数式编程实例详解
Jan 17 Python
Python tornado上传文件的功能
Mar 26 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
Python并发爬虫常用实现方法解析
Nov 19 Python
Python 数据结构之十大经典排序算法一文通关
Oct 16 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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
PHP 字符串操作入门教程
2006/12/06 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php文件缓存方法总结
2016/03/16 PHP
jQuery下的动画处理总结
2013/10/10 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
Html5自定义字体解决方法
2019/10/09 HTML / CSS
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
初中生学习生活的自我评价
2013/11/20 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
企业人事任命书
2014/06/05 职场文书
高效课堂教学反思
2016/02/24 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Python移位密码、仿射变换解密实例代码
2021/06/27 Python