首页 > 系统相关 >linux 环境下 elasticsearch 及 python 相关库的使用

linux 环境下 elasticsearch 及 python 相关库的使用

时间:2024-04-08 16:56:26浏览次数:14  
标签:index python elasticsearch file linux path os es

- elasticsearch 是什么?

elasticsearch 简称 es,是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。

- 安装

1、下载

官网下载地址

2、 解压

tar zxvf elasticsearch-8.13.0-linux-x86_64.tar.gz -C /usr/local/

3、解决JDK依赖问题

新版本的 es 压缩包中包含自带的jdk,如果当前 Linux 环境中已经安装了 jdk,启动 es 时默认找的是已经装好的jdk,此时可能会由于 jdk 版本不一致而报错!

进入 bin 目录下修改 elasticsearch 配置

# 将jdk修改为es中自带jdk的配置目录
export JAVA_HOME=/usr/local/elasticsearch-7.13.2/jdk
export PATH=$JAVA_HOME/bin:$PATH

if [ -x "$JAVA_HOME/bin/java" ]; then
        JAVA="/usr/local/elasticsearch-8.13.0/jdk/bin/java"
else
        JAVA=`which java`
fi

4、创建 es 用户

注意root用户不能启动!

#创建用户
useradd user-es

#递归设置 es 目录用户及用户组
chown user-es:user-es -R /usr/local/elasticsearch-8.13.0

#切换用户
su user-es

#进入bin目录
cd /usr/local/elasticsearch-8.13.0/bin

#启动elasticsearch
./elasticsearch

本地访问http://ip:9200 进行测试,默认会需要输入密码

如需取消登录密码,将 /usr/local/elasticsearch-8.13.0/config/elasticsearch.yml 文件中 xpack.security.enabled 参数修改为 false

修改日志路径、端口号等信息文件:

/usr/local/elasticsearch-7.13.2/config/elasticsearch.yml

补充:以下问题可能会遇到

  • es 内存不足问题

vim /usr/local/elasticsearch-8.13.0/config/jvm.options

## -Xms4g
## -Xmx4g

修改为(注意顶格,不要留空格):

-Xms1g
-Xmx1g
- 使用 Python 操作 es
目的:将某一目录下的大量文件全部导入到 es,之后对某个文件进行查找操作
  • 版本一
import os
from datetime import datetime
from elasticsearch import Elasticsearch

#连接到 es
es = Elasticsearch(['http://ip:port'])

file_index = "test1"
directory = "/mnt/dir1"

for root, dirs, files in os.walk(directory):
  for filename in files:
    file_path = os.path.join(root, filename)
    if not es.exists(index=file_index, id=file_path):
        file_info = {
          "file_path": file_path,
          "file_size": os.path.getsize(file_path),
          "created_at": datetime.fromtimestamp(os.path.getctime(file_path)),
        }
        #插入文件信息
        es.index(index=file_index, id=file_path, body=file_info)
    else:
        #print(f"Document with id '{file_path}' already exists in the index.")
        pass

#查找
file_name = "file2"
query = {
    "query": {
        "match": {
            "file_path": file_name
            }
        }
    }
result = es.search(index="test1", body=query)
for hit in result['hits']['hits']:
    print(hit['_source'])

#es.indices.delete(index=file_index)

实现了基本功能,但效率极低

  • 版本二

一条一条将文件信息插入到 es 效率太低,可以将数据打包好再发给 es,使用 es 的 bluk 库一并提交

bulk指令用于批量添加、更新或删除文档。这个指令允许用户在一个请求中提交多个操作

import os
from datetime import datetime
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

#连接到 es
es = Elasticsearch(['http://ip:port'])

file_index = "test1"
directory = "/mnt/dir1"
data = []

for root, dirs, files in os.walk(directory):
  for filename in files:
    file_path = os.path.join(root, filename)
    if not es.exists(index=file_index, id=file_path):
        file_info = {
          "file_path": file_path,
          "file_size": os.path.getsize(file_path),
          "created_at": datetime.fromtimestamp(os.path.getctime(file_path)),
        }
        #打包数据
        data.append(file_info)
    else:
        #print(f"Document with id '{file_path}' already exists in the index.")
        pass
#批量提交
success, failed = bulk(es, data)
print(f"成功写入文档数: {success}, 失败文档数: {failed}")

#查找
file_name = "file2"
query = {
    "query": {
        "match": {
            "file_path": file_name
            }
        }
    }
result = es.search(index="test1", body=query)
for hit in result['hits']['hits']:
    print(hit['_source'])

#es.indices.delete(index=file_index)
  • 版本四
    分片 + 线程池 + bulk
import os
import concurrent.futures
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

# Elasticsearch连接配置
es = Elasticsearch(['http://ip:port'])

files_index = "test4"
directory = "/mnt/dir1"

# 准备一个函数用于将文件信息导入到Elasticsearch中
def index_files_bulk(file_paths):
    actions = []
    for file_path in file_paths:
        file_info = {
            'file_name': os.path.basename(file_path),
            'file_path': file_path,
            # 这里可以根据需要添加更多的文件信息
        }
        # 准备批量操作
        doc_id = hash(file_path)  # 以文件路径的哈希值作为文档ID
        action = {
            '_op_type': 'update',
            '_index': files_index,
            '_id': doc_id,
            'doc': file_info,
            'doc_as_upsert': True  # 如果文档不存在则插入
        }

        actions.append(action)

    # 使用批量操作
    bulk(es, actions)

def index_files_parallel(directory):
    file_paths = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_paths.append(os.path.join(root, file))

    # 使用多线程处理文件信息导入
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # 将文件路径切分成小块,每个线程处理一部分
        chunk_size = 1000  # 每个线程处理的文件数量
        for i in range(0, len(file_paths), chunk_size):
            chunk = file_paths[i:i + chunk_size]
            executor.submit(index_files_bulk, chunk)

# 调用函数并行导入文件信息到Elasticsearch中
#index_files_parallel(directory)

#查找
file_name = "file4"
query = {
    "query": {
        "match": {
            "file_path": file_name
            }
        }
    }
result = es.search(index="test1", body=query)
for hit in result['hits']['hits']:
    print(hit['_source'])

#es.indices.delete(index=file_index)

未完。。。。

标签:index,python,elasticsearch,file,linux,path,os,es
From: https://www.cnblogs.com/itsfei/p/18121695

相关文章

  • Linux历史 centos 7.6安装
    Linux历史 说到操作系统就需要先讲一讲Unix,UNIX操作系统,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson、DennisRitchie和DouglasMcIlroy于1969年在AT&T的贝尔实验室开发,那时候Unix可以免费用于学校教学使用......
  • [docker] rockylinux8安装docker
    rockylinux8默认使用podman代替podman,但是在使用podman+portainer时出现不少问题,所以打算安装回docker,在此记录一下安装dockeryuminstall-yhttps://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpmyuminstall-yyum-......
  • Python大创项目参考 智能家居控制(半成品且未参赛)建议用于电气、计科、通信相关专业—
    (优质长文警告⚠️,全文包含代码共计22000+字,完整阅读时间较长)智能家居行业是指通过互联网、物联网、人工智能等先进技术将家庭设备和设施连接起来,实现智能化控制和管理的新兴产业。本项目参考了github开源“博联智能家居”,采用博联旗下鸿雁系列智能插座和路由,算是二次开发。目......
  • Python实现 时域和频域 数值演变——blog7
    数值演变是指在一定时间段内,数值发生变化或发展的过程。在数值演变过程中,数值可以增加、减少、保持稳定,甚至发生剧烈波动。数值演变可以应用于各个领域,例如经济学、生态学、物理学等。在经济学中,数值演变可以描述经济指标(如GDP、通货膨胀率、失业率等)的变化情况,帮助分析经济发......
  • python WAV音频文件处理—— (1)读写WAV文件
    https://realpython.com/python-wav-files/#visualize-audio-samples-as-a-waveform了解WAV文件格式WAV是一种波形音频文件格式(WaveformAudioFileFormat)。虽然是一种古老的格式(九十年代初开发),但今天仍然可以看到这种文件。WAV具有简单、可移植、高保真等特点。WA......
  • Linux中的权限
    Linux中的用户与创建用户的类型超级管理用户:权限最高的用户(uid:0) #uid:是用户的身份证号,Linux系统只认uid普通用户:权限受限的用户(uid:1000-60000)程序用户:不是给人登陆使用:是给程序使用(uid:1-999)一个用户必须有一个基本组,附加组可有可无,也可以有多个基本组:必须要有,有且......
  • Python学习笔记-001
    记录一下重学python,虽然python老早就接触了,更多的还是停留在语法层面,老c++了。最近打算从头开始系统拉一下python的基础,先预计8天学完。后面还打算系统学一下Numpy,Pandas和Matplotlib。python基础教程python简介检查是否安装python,终端输入python--versionpython是一种解释......
  • 2024最新软件测试【测试理论+ Linux】面试题(内附答案)
    一、测试理论3.1你们原来项目的测试流程是怎么样的?我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段我们的SE会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议,我们会把不明白不理解的需求在会议上说出来,包......
  • Linux boot目录扩容
    1.背景安装Centos7.8的时候,boot分区大小分配了200M,现准备升级到Centos7.9,报错,boot目录不足。2.删除分区如果装完系统后,磁盘所有空间都被分配出去了,此时需要删除一个分区来挤出空间本例使用Data目录,因为里面的东西都不重要,因此决定卸载这个目录并删除其对应的分区2.1.顺利卸载......
  • 记录linux从0部署java项目(宝塔)
    目录一、安装宝塔可视化界面 二、部署前端三、部署后端1、配置并连接Mysql数据库2、配置并连接redis3、安装jdk这里先记录一个安装后遇到的问题安装openJDK四、检查一、安装宝塔可视化界面宝塔面板下载,免费全能的服务器运维软件运行安装脚本安装完成后访问......