网络编程
位置:首页>> 网络编程>> Python编程>> python 动态迁移solr数据过程解析

python 动态迁移solr数据过程解析

作者:1066897515  发布时间:2023-03-08 10:19:20 

标签:python,动态,迁移,solr,数据

前言

上项目的时候,遇见一次需求,需要把在线的 其中一个 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数据过程解析

来源:https://blog.51cto.com/zdhyw/2435090

0
投稿

猜你喜欢

  • 在上一篇博客中,已经将环境搭建好了。现在,我们利用搭建的环境来运行一条测试脚本,脚本中启动一个计算器的应用,并实现加法的运算。创建模拟器在运
  • 概要本文分步介绍了如何在运行 SQL Server 的计算机之间移动 Microsoft SQL Server 用户数据库和大多数常见的 S
  • 一、继承的格式类的继承格式如下,括号中的为父类名。class 类名(父类名): 代码二、单继承下面我们让Man继承自Master类,并调用继
  • 曾有位网友遇到这样一个问题:产品名称为“A&T Plastic”,在产品列表中需要做这样的超链接,<a href="
  • 本文实例为大家分享了js实现简单贪吃蛇效果的具体代码,供大家参考,具体内容如下上代码之前,先给大家看一下效果:是不是想说:我能这样玩一天…话
  • zy3287 问:<script src="js.js?id=999" type="text/javas
  • 刚接触 Go 语言时,就听说有一个叫rune的数据类型,即使查阅过一些资料,对它的理解依旧比较模糊,加之对陌生事物的天然排斥,在之后很长一段
  • ThinkPHP CURD方法的limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。并且
  • 在我做过的N多项目中,基本都有个跑不开的怪圈——首页很难设计。根据进度安排,首页必须按时出来,不然没法review,也没法测试。于是,首页只
  • 程序一:负责从字典中随机提取数据,写入一个新文件。(1.php) <?php /* 从字典文件中提取随机值 */
  • 本文实例讲述了Python使用当前时间、随机数产生一个唯一数字的方法。分享给大家供大家参考,具体如下:Python生成当前时间很简单,比Ja
  • urllib3是一款Python 3的HTTP客户端。Python标准库提供了urllib。在Python 2中,另外提供了urllib2;
  • show parameter processes; 然后 更改系统连接数 alter system set processes=1000 s
  • alert table 表名 add column 列名 alter table 表名 drop column 列名 eg: alter t
  • 去年淘宝做了个“胖子”项目,就是把网页的默认宽度从780提升到了950。也就是说,基本放弃了800×600的用户(没有完全放弃,如果你仔细研
  • 本文旨在挖掘表格在艺术创意方面的一些功能效果。运行代码框<script language="JavaScript"
  • 对象Javascript 根本上是和对象相关的。数组是对象。函数是对象。对象是对象。那什么是对象呢?对象是名-值对的集合。名是字符串,值可以
  • 本文主要介绍了一个获得当前数据库对象依赖关系的实用算法,具体示例请大家参考下文:create   function&nb
  • php魔术方法在php类保留方法中以 &ldquo;__&rdquo;两个下划线开头的函数称为魔术方法,我的理解为php类设
  • 在风起云涌的互联网浪潮中,产品迭代的速度越来越快。随着用户需求的激增,也不断带来了对设计师能力要求的提高。初入交互设计领域几年来,明显发现可
手机版 网络编程 asp之家 www.aspxhome.com