项目需要导出知识库博客文章数据,格式为json;
知识库系统部署在内网,没有node和elasticdump数据导出工具,需要离线安装node和elasticdump,方法是找一台与内网配置一样的外网机器在线安装node和elasticdump环境,再把安装包导入内网安装。
备注:使用的机器是x86+银行麒麟V4桌面版操作系统
# 1.下载node安装包,命令行或网页下载,我下载的是V16版本,使用elasticdump尽量安装10版本以上的:
wget https://nodejs.org/dist/v16.14.2/node-v16.14.2-linux-x64.tar.gz
# 2. 把压缩包移动到安装路径下(注意:不要先解压,否则一些命令链接会失效),进入目录下解压,
# 我的安装路径是/usr/lib,也可以放到其他目录下
mv node-v16.14.2-linux-x64.tar.gz /usr/lib
cd /usr/lib
tar -xzvf node-v16.14.2-linux-x64.tar.gz
# 3. 建立命令的软连接,就是文件的快捷方式,把这个快捷方式发送到/usr/local/bin
#(有的系统放/usr/bin);
ln -s /usr/lib/node-v16.14.2-linux-x64/bin/node /usr/local/bin
ln -s /usr/lib/node-v16.14.2-linux-x64/bin/npm /usr/local/bin
# 4. 检测环境,不出意外会看到版本信息,如果报错,检测安装过程,重新安装:
node -v
npm -v
# 1.使用npm命令安装elasticdump :
npm install elasticdump -g
# 2. 建立elasticdump命令软链接
ln -s /usr/lib/node-v16.14.2-linux-x64/lib/node_modules/elasticdump/bin/elasticdump /usr/local/bin/elasticdump
# 3. 检测环境,安装成功,会看到elasticdump帮助信息,导出数据时需要查看这些帮助参数的用法:
elasticdump --help
在线安装成功后,把node的安装包和elasticdump安装后的缓存打包导入内网,进行安装,
以下是导出缓存和离线安装步骤:
# 1. 查看npm缓存路径,我的是/root/.npm
npm config get cache
# 2.把elasticdump安装后的缓存目录打包
cd /root
tar -cf npm-cache.tar .npm
打包完成后在/root目录下生成npm-cache.tar文件
把在线下载的node-v16.14.2-linux-x64.tar.gz 和 npm-cache.tar
# 1.参见外网步骤安装node,安装完的目录为:/usr/lib/node-v16.14.2-linux-x64
# 2.拷贝npm-cache.tar到/root,并解压缩
mv npm-cache.tar /root
cd /root
tar -xvf npm-cache.tar
# 3.先进入/usr/lib/node-v16.14.2-linux-x64/bin安装elasticdump
cd /usr/lib/node-v16.14.2-linux-x64/bin
# --cache-min这个参数是指超过多少分钟,才去网络下载,设置足够大就会从缓存安装
npm install --cache /root/.npm --optional --cache-min 9999999 -shrinkwarp false elasticdump
# 4.创建软连接
ln -s /usr/lib/node-v16.14.2-linux-x64/lib/node_modules/elasticdump/bin/elasticdump /usr/local/bin/elasticdump
# 5. 检测环境,安装成功,会看到elasticdump帮助信息,导出数据时需要查看这些帮助参数的用法:
elasticdump --help
> 1.查询elasticsearch 语句查看现有es index doc数量:
> http://ip:9200/_cat/indices?v
>
> 2.查询某个index下文章数量
> http://ip:9200/_cat/count/index_name?v
>
> 3.查看索引mapping:
> http://ip:9200/索引名称/_mapping?pretty
>
> 4.按某字段搜索,其中attach_type是字段名称,mp4是字段值:
> http://ip:9200/索引名称/_search?q=attach_type:mp4(搜索类型为MP4的doc)
>
> 5.控制返回数据的数量
> http://ip:9200/索引名称/_search?size=2
>
> 6.按id搜索doc:
> http://ip:9200/索引名称/_doc/#id值
基本的导入导出,可通过终端elasticdump --help查看
1.从一个 elasticsearch导入到另一个 elasticsearch
1)mapping导入
elasticdump \
--input=http://production.es.com:9200/my_index \
--output=http://staging.es.com:9200/my_index \
--type=mapping
2)data导入
elasticdump \
--input=http://production.es.com:9200/my_index \
--output=http://staging.es.com:9200/my_index \
--type=data
2.导出成json文件
1)按create_time字段的时间范围筛选数据并导出json,并按该字段倒序排列
term 是要筛选的字段和值,这里针对有id字段的数据,type替换为id,把blog替换为id值,可以筛选出唯一的数据
elasticdump --input=http://192.168.8.9:9200/all_prod_v8_main \
--output=/opt/data/data_1000_20230524.json \
--type=data \
--searchBody='{"query":{"bool":{"must":[{"term":{"type":"blog"}},{"range":{"create_time":{"gte":"2020-01-01","lt":"2022-02-01"}}}],"must_not":[],"should":[]}},"sort":[{"create_time":{"order":"desc"}}],"aggs":{}}'
2)控制导出数据的数量,导出10000条数据
elasticdump --input=http://192.168.8.9:9200/all_prod_v8_main \
--output=/opt/data/data_10000_20230524.json \
--type=data \
--size=10000 \
--searchBody='{"query":{"bool":{"must":[{"term":{"type":"blog"}}],"must_not":[],"should":[]}},"sort":[{"create_time":{"order":"desc"}}],"aggs":{}}'
3)全部导出,依据文件大小进行自动分隔(也可依据行数进行分割–maxRows),20Mb左右一个文件,导出过程自动把文件进行分割,
#–limit 每次请求数据的数量,默认100,要导出的数据量大时,此值改大提高效率
#–fileSize(–maxRows):对导出的数据按文件大小或按行数分割成多个文件
#–overwrite 存储路径文件存在进行覆盖
#-- 更多参数终端输入elasticdump --help查看
elasticdump --input=http://192.168.8.9:9200/all_prod_v8_main \
--output=/opt/data/20Mb/data_20mb_20230524.json \
--type=data \
--limit=1000 \
--fileSize=20mb \
--overwrite=true \
--searchBody='{"query":{"bool":{"must":[{"term":{"type":"blog"}}],"must_not":[],"should":[]}},"sort":[{"create_time":{"order":"desc"}}],"aggs":{}}'
文章参考:
https://blog.csdn.net/su8888i/article/details/130287754