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语言实现获取主机名根据端口杀死进程
Mar 31 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 Python
Django开发中的日志输出的方法
Jul 02 Python
pytorch训练imagenet分类的方法
Jul 27 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
详解Django admin高级用法
Nov 06 Python
Python函数生成器原理及使用详解
Mar 12 Python
Python 如何反方向迭代一个序列
Jul 28 Python
Django返回HTML文件的实现方法
Sep 17 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP 读取文件的正确方法
2009/04/29 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
python解析xml文件操作实例
2014/10/05 Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
用Python解决计数原理问题的方法
2016/08/04 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
C#面试问题
2016/07/29 面试题
实习单位推荐信范文
2013/11/27 职场文书
运动会广播稿500字
2014/01/28 职场文书
客服专员岗位职责
2015/02/10 职场文书
建筑工程催款函
2015/06/24 职场文书
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android