Elasticsearch实战之处理邮件附件进行进行内容全文检索

news2024/12/29 9:02:13

目录

一、系统环境和软件要求

二、软件说明

三、定义文本抽取管道(pipeline)

四、建立索引设置文档结构映射

五、插入文档

六、查询文档


需求是将本地邮件内容以及PDF,EXCEL,WORD等附件内容进行处理,保存到ES数据库,实现邮件内容及附件内容的全文检索。

一、系统环境和软件要求

系统:CentOS7.3

elasticsearch版本:7.13.3

kibana版本:7.16.3

ingest-attachment插件版本:7.13.3

二、软件说明

Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。当前我们的用途主要是在kibana的开发工具dev tools中执行一些命令。

Ingest-Attachment是一个开箱即用的插件。可以将常用格式的文件作为附件写入Index。ingest attachment插件通过使用Apache Tika来提取文件,支持的文件格式有TXT、DOC、PPT、XLS和PDF等。 可以进行文本抽取及自动导入。注意:源字段必须是base64编码的二进制。

缺点:在处理xls和xlsx格式的时候,无法将sheet分开索引,只能将整个文件当做一个文档插入es中。

三、安装插件

我这里采用离线方式安装Ingest-Attachment,通过wget方式直接下载跟elasticsearch版本相同的离线文件。

wget https://artifacts.elastic.co/downloads/elasticsearch-plugins/ingest-attachment/ingest-attachment-7.13.3.zip

上传到服务器 目录

/home/es/install/ingest-attachment-7.13.3.zip

进入ES_HOME的主目录,执行下面的命令进行安装

cd /home/elasticsearch/

./bin/elasticsearch-plugin install file:///home/es/install/ingest-attachment-7.13.3.zip

安装完成后重启elasticsearch服务

插件安装完成!

三、定义文本抽取管道(pipeline)

在kibana的dev tool执行

我这里邮件可能是多个附件,所以定义文本抽取管道(多附件),我这里是设置 处理后移除base64的二进制数据。

需要注意的是,多附件的情况下,field和target_field必须要写成_ingest._value.*,否则不能匹配正确的字段。

PUT _ingest/pipeline/multiple_attachment
{
    "description" : "Extract attachment information from arrays",
    "processors" : [
      {
        "foreach" : {
          "field" : "attachments",
          "processor" : {
            "attachment" : {
              "target_field" : "_ingest._value.attachment",
              "field" : "_ingest._value.content"
            }
          }
        }
      },
      {
        "foreach" : {
          "field" : "attachments",
          "processor" : {
            "remove" : {
              "field" : "_ingest._value.content"
            }
          }
        }
      }
    ]
}

插件ingest attachment的pipeline参数含义

Name是否必须DefaultDescription
fieldyes-从这个字段中获取base64编码
target_fieldnoattachment用于保留attachment信息,主要用于多附件的情况
indexed_charsno100000限制字段的最大保存字符数。-1为无限制。
indexed_chars_fieldno-可以从数据中设定的字段取到indexed_chars限制的值。
propertiesno全属性选择需要存储的属性。例如 contenttitlenameauthorkeywordsdatecontent_typecontent_lengthlanguage
ignore_missingnoFALSE如果使用true,并且 field 不存在, 则会忽略附件直接写入doc;否则则会报错。

四、建立索引设置文档结构映射

PUT mail
{
  "settings": {
    "index": {
      "max_result_window": 100000000
    },
    "number_of_shards": 3,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "mfrom": {
        "type": "keyword"
      },
      "mto": {
        "type": "keyword"
      },
      "mcc": {
        "type": "keyword"
      },
      "mbcc": {
        "type": "keyword"
      },
      "rcvtime": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "subject": {
        "type": "keyword"
      },
      "importance": {
        "type": "keyword"
      },
      "savepath": {
        "type": "keyword"
      },
      "mbody": {
        "type": "text",
        "fields": {
          "keyword": {
            "ignore_above": 256,
            "type": "keyword"
          }
        }
      },
      "attachments": {
        "properties": {
          "attachment": {
            "properties": {
              "content": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "ignore_above": 256,
                    "type": "keyword"
                  }
                }
              },
              "filename": {
                "type": "keyword"
              },
              "type": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}

创建成功会返回

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "mail"
}

五、插入文档

可以使用Postman来调用elasticsearch的rest full接口完成文档插入或者更新。

请求类型:POST
请求地址:http://192.168.31.200:9200/mail/_doc?pipeline=multiple_attachment

请求地址中mail是索引名,pipeline=multiple_attachment指定需要使用的管道(pipeline)是multiple_attachment

请求body内容是JSON格式:

{
    "mfrom": "microsoft.teams@outlook.com",
    "mto": "network@163.com",
    "mcc": "",
    "mbcc": "",
    "rcvtime": "2023-05-18 23:35:29",
    "subject": "神奇的邮件2023066- ",
    "importance": "1",
    "savepath": "d:\\mail\\TEST123.eml",
    "mbody": "这是邮件内容",
     "attachments": [
        {
            "filename": "附件名字1.pdf",
            "type": ".pdf",
            "content": "5oiR54ix5L2g5Lit5Zu9MjAyMw=="
        },
        {
            "filename": "附件名字2.xlsx",
            "type": ".xlsx",
            "content": "Q2hhdEdQVCDniZvpgLwh"
        }
    ]
}

attachments是JSON数组,里面放2个附件的信息。filename是附件名字,content是附件解析出来的base64编码字符串。插入时通过管道处理,会自动识别内容,剩下的跟操作普通的索引一样。

下面是执行成功返回的内容:

{
    "_index": "mail",
    "_type": "_doc",
    "_id": "eiCNNIgBUc2qXUv978Tg",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

Postman截图

六、查询文档

6.1 根据_id查看文档

GET请求地址 http://192.168.31.200:9200/mail/_doc/eiCNNIgBUc2qXUv978Tg

参数和内容无

其中eiCNNIgBUc2qXUv978Tg为文档_id,mail为需要查询的索引名

返回结果:

{
    "_index": "mail",
    "_type": "_doc",
    "_id": "eiCNNIgBUc2qXUv978Tg",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "savepath": "d:\\mail\\TEST123.eml",
        "mbody": "这是邮件内容",
        "attachments": [
            {
                "filename": "附件名字1.pdf",
                "attachment": {
                    "content_type": "text/plain; charset=UTF-8",
                    "language": "lt",
                    "content": "我爱你中国2023",
                    "content_length": 10
                },
                "type": ".pdf"
            },
            {
                "filename": "附件名字2.xlsx",
                "attachment": {
                    "content_type": "text/plain; charset=UTF-8",
                    "language": "lt",
                    "content": "ChatGPT 牛逼!",
                    "content_length": 12
                },
                "type": ".pdf"
            }
        ],
        "mbcc": "",
        "subject": "神奇的邮件2023066- ",
        "importance": "1",
        "mfrom": "microsoft.teams@outlook.com",
        "mto": "network@163.com",
        "mcc": "",
        "rcvtime": "2023-05-18 23:35:29"
    }
}

Postman截图

6.2 模糊查询附件名字

Post请求地址 ​http://192.168.31.200:9200/mail/_search

​请求内容是JSON字符串,attachments.filename.keyword是附件名字(不分词)

{
  "query": {
        "bool": {
            "should": [{
                "wildcard": {
                    "attachments.filename.keyword": "*附件*"
                  
                }
            }]
        }
    }
}

返回结果

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "mail",
                "_type": "_doc",
                "_id": "eiCNNIgBUc2qXUv978Tg",
                "_score": 1.0,
                "_source": {
                    "savepath": "d:\\mail\\TEST123.eml",
                    "mbody": "这是邮件内容",
                    "attachments": [
                        {
                            "filename": "附件名字1.pdf",
                            "attachment": {
                                "content_type": "text/plain; charset=UTF-8",
                                "language": "lt",
                                "content": "我爱你中国2023",
                                "content_length": 10
                            },
                            "type": ".pdf"
                        },
                        {
                            "filename": "附件名字2.xlsx",
                            "attachment": {
                                "content_type": "text/plain; charset=UTF-8",
                                "language": "lt",
                                "content": "ChatGPT 牛逼!",
                                "content_length": 12
                            },
                            "type": ".pdf"
                        }
                    ],
                    "mbcc": "",
                    "subject": "神奇的邮件2023066- ",
                    "importance": "1",
                    "mfrom": "microsoft.teams@outlook.com",
                    "mto": "network@163.com",
                    "mcc": "",
                    "rcvtime": "2023-05-18 23:35:29"
                }
            }
        ]
    }
}

6.3 模糊查询附件内容

POST请求地址 http://192.168.31.200:9200/mail/_search

请求内容为JSON格式,attachments.attachment.content是附件内容(不加密)

{
    "size":"10000",
    "_source" :[
        "_id",
        "seqnbr",
        "subject",
        "eml"
    ],
    "query": {
    "match": {
      "attachments.attachment.content":"*ChatGPT*"
    }
  }
}

返回结果

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "mail",
                "_type": "_doc",
                "_id": "eiCNNIgBUc2qXUv978Tg",
                "_score": 0.2876821,
                "_source": {
                    "subject": "神奇的邮件2023066- "
                }
            }
        ]
    }
}

七、其他说明


下面是单独说明的定义文本抽取的管道single_attachment

在kibana的dev tool执行

PUT _ingest/pipeline/single_attachment

{
  "description" : "Extract single attachment information",
  "processors" : [
    {
      "attachment" : {
        "field": "data",
        "indexed_chars" : -1,
        "ignore_missing" : true
      }
    }
  ]
}

剩下的就是代码集成的问题了。关于中文分词IK插件的使用,后期需要再详细说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/546638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】

【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】 1. 概述2. I2C 的工作原理3. I2C 协议4. 例程5. Arduino I2C 代码在本教程中,我们将了解 I2C 通信协议的工作原理,我们还将使用 Arduino 板和使用该协议的传感器制作一个实际示例。您可以观看以下视频或阅读下面的书面教程…

chatgpt赋能Python-python3虚拟环境搭建

Python3虚拟环境搭建:介绍和步骤 Python是一门非常强大的编程语言,因此在许多不同类型的项目中都广泛使用。但是,不同项目可能需要使用不同版本的Python库和依赖项。这就是使用Python的虚拟环境的重要性,可以避免不同项目之间的冲…

「实验记录」MIT 6.824 Raft Lab2B Log Replication

#Lab2B - Log Replication I. SourceII. My CodeIII. MotivationIV. SolutionS1 - leader上任即初始化S2 - leader发送AppendEntriesS3 - follower接收AppendEntriesS4 - leader收到AppendEntries 回信S5 - candidate选举限制S6 - defs.go约定俗成和实现Start() V. Result I. S…

yolov7结构改进策略解析

论文链接:https://arxiv.org/abs/2207.02696 代码链接:https://github.com/WongKinYiu/yolov7 具体分割如何训练,请参考我之前的博客论文: https://blog.csdn.net/qq_41920323/article/details/129464115?spm1001.2014.3001.5502…

联用多个插件可以让 GPT-4 的能力更加强大,实现更加复杂的操作

🚀 联用多个插件可以让 GPT-4 的能力更加强大,实现更加复杂的操作。 联用多个插件可以让 GPT-4 的能力更加强大,实现更加复杂的操作。 不过,使用插件和联网功能也有一些要注意的地方。 首先是安全性问题,特别是像购…

Burpsuite模块—-Intruder模块详解

一、简介 Burp Intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击,Burp Intruder 是高度可配置的,并被用来在广范围内进行自动化攻击。你可以使用 Burp Intruder 方便地执行许多任务,包括枚举标识符,获取有…

Kali-linux密码在线破解

为了使用户能成功登录到目标系统,所以需要获取一个正确的密码。在Kali中,在线破解密码的工具很多,其中最常用的两款分别是Hydra和Medusa。本节将介绍使用Hydra和Medusa工具实现密码在线破解。 8.1.1 Hydra工具 Hydra是一个相当强大的暴力密…

浅谈分布式事物解决方案

目录 背景 1 XA规范分布式事物方案 1.1 俩阶段提交(2PC) 1.2 三阶段提交(3PC) 2 补偿事务(TCC) 3 可靠消息最终一致性方案 4 可靠消息最终一致性方案 5 SAGA事物 6 Seata AT 模式 背景 分布式事务出现…

使用Git-lfs上传超过100m的大文件到GitHub

文章目录 1. 安装 git-lfs2. 在Git中安装git-ifs3. 找到工程中的所有大文件4.执行完这行命令,项目目录下会生成文件 .gitattributes,此时Git push将 .gitattributes 提交到远程仓库。 5. 需要注意的事 1. 安装 git-lfs Git Large File Storage | Git La…

Day44【动态规划】完全背包、518.零钱兑换 II、377.组合总和 Ⅳ

完全背包 文章讲解 视频讲解 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将物品装入背包里的最大价值 完全背包和01背包问题…

F103ZET6使用FSMC和HAL点亮ILI9341

前言 将标准库下的ILI9341驱动移植到使用CubeMX生成的HAL库环境,并成功运行。 一、STM32CubeMX生成框架 (一)配置RCC、SYS和时钟树 参见常规配置。 (二)配置FSMC 1、原理图引脚定义 LCD8080接口使用的引脚主要分…

【数据结构】线性表 ⑤ ( 双循环链表 | 双循环链表特点 | 双循环链表插入操作处理 | 代码示例 - 使用 Java 实现 双循环链表 )

文章目录 一、双循环链表二、双循环链表特点三、双循环链表插入操作处理四、代码示例 - 使用 Java 实现 双循环链表 一、双循环链表 " 双循环链表 " 是 在 单循环链表 的基础上 , 在每个 节点 中 , 新增一个 指针 , 指向 该节点 的 前驱节点 ; 双向循环链表 每个 节…

头歌计算机组成原理实验—运算器设计(8)第8关:乘法流水线设计

第8关:乘法流水线设计 实验目的 学生掌握运算流水线基本概念,理解将复杂运算步骤细分成子过程的思想,能够实现简单的乘法运算流水线。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件,在6位补码阵列乘法器中利用5位阵列乘…

React学习笔记三-模块与组件的理解

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第三篇,主要介绍react中的模块与组件。 目录 1.模块与组件 1.1模块 1.2组件 1.3模块化 1.4组件化 2.React面向组件编程 2.1函数式组件 2.2类组件 2.2.1类知识的复…

防火墙(一)

防火墙知识 一、iptables概述二、四表五链四表五链iptables防火墙的使用方法 三、示例操作四、规则的匹配通用匹配:隐含匹配:端口匹配: --sport源端口、--dport目的端口TCP标志位匹配:ICMP类型匹配:显示匹配&#xff1…

Windows 安装MySQL 8.0 超详细教程(mysql 8.0.30)

目录 一、删除以前安装的MySQL服务 1、查找以前是否装有mysql 2、删除mysql (1)停止mysql服务: (2)删除mysql服务: 3.检查mysql是否已删除 二、下载mysql二进制包 三、解压二进制包,编辑…

一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理笔记(大全) 🧊…

第一个 Rust 程序

目录 必要知识代码示例 Cargo 教程[Rust 输出到命令行](https://www.runoob.com/rust/rust-println.html)资料 必要知识 Rust 语言代码文件后缀名为 .rs 使用 rustc 命令编译 .rs 文件 rustc runoob.rs # 编译 runoob.rs 文件编译后会生成 可执行文件 例如: …

『python爬虫』26. selenium与超级鹰处理复杂验证码的处理(保姆级图文)

目录 1. 图片选择类验证码2. 滑块验证码3. 滑块出错,不加载总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 图片选择类验证码 我们这里查看超级鹰文档 图片验证码返回的是一个 dic 结构为 x1,y1…

【SAM系列】An Alternative to WSSS? An Empirical Study of SAM on WSSS Problems

论文链接:https://arxiv.org/pdf/2305.01586.pdf 论文代码:暂无 目的 WSSS旨在弱标签的情况下,生成高质量的分割伪标签,然后用于全监督的语义分割训练。本文探索用SAM来生成伪标签来替代WSSS方案。 为什么不直接用SAM分割而利用…