使用Elasticsearch进行word,excel,PDF的全文检索 windows实现 超完整(ingest-attachment实现)

news2025/1/12 12:07:02

首先要明确的一点就是Elasticsearch的版本要和ingest-attachment的版本一致,要不然没办法安装。然后还有一点JAVA版本要在11以上

先说说原理吧,其实就是将文件base64编码,然后再用插件读取文件内容并保存到es中。

1.如果你的版本是JAVA1.8的话,最好换成JDK11

安装完jdk之后用cmd查看一下java -version看看是否已经从1.8修改为了11

如果没有边的话则需要修改环境变量

可以在开始菜单输入env快速打开环境变量配置

 首先修改JAVA_HOME

然后还是和配置jdk一样修改path 

但是这里有一个坑点,那就是除了你自己配置的jdk path之外可能还有一个oracle的path,记得把他给删了,要不java -version后还是1.8

2.安装Elasticsearch 7.9.0

我的es是在这个链接下载的:

https://rjxcvbn.tianjiuda.com/20211206/elasticsearch_v7.9.0_xitongcheng.zip

下载完毕之后解压

进入bin目录 

双击elasticsearch.bat即可运行es

 运行完成后可以访问http://127.0.0.1:9200/ 查看是否正常运行

3.下载配置ingest-attachment-7.9.0

这里一定要下载和上面一样的版本,否则无法安装

下载地址:https://artifacts.elastic.co/downloads/elasticsearch-plugins/ingest-attachment/ingest-attachment-7.9.0.zip

 比如说ingest-attachment-5.4.2.zip 在D盘根目录,那我们就可以在elastics的根目录下运行下面的命令

bin\elasticsearch-plugin install file:///D:\ingest-attachment-5.4.2.zip 

这样他就会将ingest-attachment的插件安装到elasticsearch上了。这里就不放截图了,因为我已经安装好了。

安装好之后可以通过PowerShell查看是否安装完成  

首先切换目录到ES根目录:

输入 .\bin\elasticsearch-plugin list如果有ingest-attachment则代表安装成功

 

 然后我们可以重启es。重启方式就是关闭cmd然后重新打开步骤1的.bat

3.POSTMAN  ES基础使用教程

如果已经会使用es请跳过该步骤

先偷一张图

我就以mysql数据库举例吧,比如说mysql中的表在es里应该叫索引,我就直接叫表吧,毕竟不跳过这里的估计也没太看过es的教程。我这里就是简单的说一说,想要具体了解请看其他的文章。。

es新建表可以通过postman来建立

PUT请求发送127.0.0.1:9200/test 

其中test可以理解为表的名称 

然后我们可以向表中添加数据,因为es类似于Mongodb,存储的数据为json类型,是非关系型数据库,不存在字段这一说,所以数据我们可以随便存。

插入数据:127.0.0.1:9200/test/_doc/1002

请求体:

{
    "title":"小米手机1",
    "category":"小米1",
    "image":"www.yy.com",
    "price":3999.00
}

这里需要注意,还是要用put请求,test相当于表名,_doc可以理解为固定写法,最后的1002可以不写,写了就是指定这个数据的id为1002,不写则是随机生成的字符串

返回结果:

如果不写ID的话返回结果:

(不写的话得用post请求,上面我说的可能有点问题,因为我也是项目上需要所以也没深入了解,只看了半天,就随便写了个小demo) 

可以看见这里的id是nFez2IgBadwYgUd60r2A,这个是自动生成的。

然后我们可以根据id去查询。

127.0.0.1:9200/test/_doc/nFez2IgBadwYgUd60r2A

这里是get请求,需要注意一定不要选成post,否则会直接对数据进行更新。

返回值:
 

{
    "_index": "test",
    "_type": "_doc",
    "_id": "nFez2IgBadwYgUd60r2A",
    "_version": 1,
    "_seq_no": 1,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "title": "小米手机1",
        "category": "小米1",
        "image": "www.yy.com",
        "price": 3999.00
    }
}

 然后删除某一条数据:

只需要将查找的请求方式改成delete就可以了。

返回值中的result是区分查找,插入和删除的方式。

还有就是查找某个表的所有数据。

使用get请求:127.0.0.1:9200/test/_search

最后就是清空这个表的所有数据

127.0.0.1:9200/test/_delete_by_query

test为要清空的表明,_delete_by_query可以理解为固定写法

请求体:

{
  "query": {
    "match_all": {}
  }
}

 返回值:

{
    "took": 133,
    "timed_out": false,
    "total": 1,
    "deleted": 1,
    "batches": 1,
    "version_conflicts": 0,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1.0,
    "throttled_until_millis": 0,
    "failures": []
}

4.打开管道

curl -X PUT "localhost:9200/_ingest/pipeline/attachment" -d '{
 "description" : "Extract attachment information",
 "processors":[
 {
    "attachment":{
        "field":"data",
        "indexed_chars" : -1,
        "ignore_missing":true
     }
 },
 {
     "remove":{"field":"data"}
 }]}'
attachment是管道名称,后面JAVA代码里有用到,可以该

这里应该用java代码去创建管道,后期我改一下

可能遇到的报错:{"error":"Content-Type header [application/x-www-form-urlencoded] is not supported","status":406}
解决:添加-H 'content-Type:application/json'

5.JAVA编程

pom中引入elsearch和fastjson

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.26</version>
        </dependency>

上传方法

public AjaxResult upload(MultipartFile file) {
        if (file.isEmpty()) {
            // 处理文件为空的情况
            AjaxResult.error("文件为空!");
        }
        String uploadPath = "H:/esupload/";
        try {
            String fileName = file.getOriginalFilename();
            String[] nameArray=fileName.split("\\.");
            //todo  如果以后要用的Demo一定要修改这里!这里只是为了快速测试,没有写业务代码
            if(nameArray.length!=2){
                return null;
            }
            String prefix=nameArray[0];
            String suffix=nameArray[1];
            long fileSize=file.getSize();
            String filePath = uploadPath + File.separator + UUID.randomUUID()+"."+suffix;

            // 保存文件到指定路径
            file.transferTo(new File(filePath));
            //将文件传到es上
            HttpClient httpClient = HttpClients.createDefault();

            try {
                // 设置 Elasticsearch 主机和端口
                String elasticHost = "http://127.0.0.1";
                int elasticPort = 9200;
                // 设置索引名称
                String indexName = "book";
                // 指定要索引的文档路径
                String documentPath = filePath;  // 替换为实际的文档路径
                // 读取文档内容并进行 Base64 编码
                byte[] documentData = Files.readAllBytes(Paths.get(documentPath));
                String encodedDocument = Base64.getEncoder().encodeToString(documentData);
                // 创建文档 JSON
                //String documentJson = String.format("{\"data\":\"%s\"}", encodedDocument);
                String documentJson = String.format("{\"data\":\"%s\", \"prefix\":\"%s\", \"suffix\":\"%s\", \"filesize\":%d}",
                        encodedDocument, prefix, suffix, fileSize);                // 创建 POST 请求
                HttpPost postRequest = new HttpPost(String.format("%s:%d/%s/_doc?pipeline=attachment", elasticHost, elasticPort, indexName));
                // 设置请求主体为 JSON 格式
                HttpEntity entity = new StringEntity(documentJson, ContentType.APPLICATION_JSON);
                postRequest.setEntity(entity);
              /*  postRequest.setEntity(entity);*/
                // 发送请求
                HttpResponse response = httpClient.execute(postRequest);
                // 处理响应
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.println(responseBody);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
            // 处理文件上传成功的情况
            return AjaxResult.success("上传成功!");
        } catch (IOException e) {
            // 处理文件上传失败的情况
            return AjaxResult.error("系统异常!");
        }

    }

列表方法

  public List<FileEntity> getList(HttpServletResponse response, String matchName, String searchValue) {
        if (StringUtils.isEmpty(matchName)) {
            matchName = "attachment.content";
        }

        List<FileEntity> files = new ArrayList<>();

        // 创建 Elasticsearch 客户端,用于信息查询
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
        try {
            // 设置要查询的索引名称
            String indexName = "book";
            // 构建查询请求
            SearchRequest searchRequest = new SearchRequest(indexName);
            // 构建查询条件

            /*  MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("attachment.content", searchValue);
             */
            if (StringUtils.isEmpty(searchValue)) {
                searchValue = "silan";
            // 使用TermQueryBuilder进行精确匹配

                SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
                searchSourceBuilder.query(QueryBuilders.matchAllQuery());
                searchSourceBuilder.size(10); // 设置返回的文档数量,默认为 10
                searchSourceBuilder.timeout(TimeValue.timeValueSeconds(10)); // 设置超时时间
            }else {
                MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery(matchName, searchValue);
                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
                boolQueryBuilder.must(matchPhraseQueryBuilder);
                SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder);
                searchRequest.source(sourceBuilder);
            }
            // 设置排序规则
            /*  sourceBuilder.sort("_source.content", SortOrder.ASC);*/
            // 设置分页
    /*        int from = 0; // 开始索引
            int size = 10; // 返回结果数量
            sourceBuilder.from(from);
            sourceBuilder.size(size);*/

            // 发起查询请求
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            // 处理查询结果
            SearchHits hits = searchResponse.getHits();
            for (SearchHit hit : hits) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                String id = hit.getId();
                String source = hit.getSourceAsString();
                try {
                    // 将 JSON 字符串转换为 JSONObject
                    JSONObject jsonObject = JSONObject.parseObject(source);
                    // 访问 JSONObject 的属性
                    String data = jsonObject.getString("data");
                    JSONObject attachment = jsonObject.getJSONObject("attachment");
                    String contentType = attachment.getString("content_type");
                    String contentLength = attachment.getString("content_length");
                    String content = attachment.getString("content");
                    String author = attachment.getString("author");
                    String prefix = jsonObject.getString("prefix");
                    String suffix = jsonObject.getString("suffix");
                    String filesize = jsonObject.getString("filesize");
                    FileEntity fileEntity = new FileEntity();
                    fileEntity.setId(id);
                    fileEntity.setData(data);
                    fileEntity.setName(prefix+"."+suffix);
                    fileEntity.setType(contentType);
                    fileEntity.setSize(filesize + "字节");
                    fileEntity.setAuthor(author);
                    fileEntity.setContent(content.substring(0, Math.min(content.length(), 300)));
                    fileEntity.setUploadTime(new Date());
                    files.add(fileEntity);
                    // 打印结果
                    System.out.println("Data: " + data);
                    System.out.println("Content Type: " + contentType);
                    System.out.println("Content: " + content);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        return files;
    }
FileEntity
@Getter
@Setter
public class FileEntity {
    private  String id;
    private  String name;
    private  String type;
    private  String author;
    private  String content;
    private  Date uploadTime;
    private  String size;
    private  String data;
}

有什么问题再问我。之前写了一半有事就存草稿了,然后今天打开发现这部分东西都忘了。。

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

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

相关文章

win11系统升级后QT的程序识别套件失败解决

解决方法&#xff1a; QTCreator的配置文件存放位置:C:\Users\%USERNAME%\AppData\Roaming\QtProject。删除这个文件夹下的文件&#xff0c;重启QT就会自动识别kits套件初始化信息等 就是QT我配置的颜色也消失了按照如下步骤重新配置后再次重启QT即可 这个方法导致我QT 上配…

苹果开发者账号续费流程及苹果开发者账号续费流程及下架处理

当开发者的苹果开发者账号即将到期时&#xff0c;可能会面临以下问题&#xff1a;“如何查看开发者账号剩余时间&#xff1f;”和“如何进行续费&#xff1f;”本文将详细解答这些问题。 如何查询账号过期时间&#xff1f; 如果距离开发者账号过期时间不到一个月&#xff0c;您…

KNIME工作流和节点比较功能

KNIME工作流和节点比较功能是一个在 << KNIME 视觉化数据分析 >> 中没有讲到的知识点。 KNIME工作流和节点比较功能在以下几种情况下非常有用&#xff1a; 版本控制&#xff1a;此功能可以跟踪工作流和节点中的更改。如果需要返回到之前的工作流或节点版本&#xf…

Spring + ECharts数据可视化

Apache ECharts是一个基于 JavaScript 的开源可视化图表库&#xff0c;在网页上实现数据的可视化&#xff0c;非常好用&#xff0c;来简单写一个demo&#xff0c;实践一下。 目录 一、成果 二、数据准备 三、具体实现 某年每个学生各科分数的柱状图 后端 前端 后端代码 …

Echarts设置X轴只显示刻度线,不显示X轴轴线

Echarts设置X轴只显示刻度线&#xff0c;不显示X轴轴线&#xff1a; option {xAxis: {......axisLine: {show: false,lineStyle: {color: red,}},......},...... } 效果&#xff1a; 上图中X轴轴线位置的横线&#xff0c;其实是yAxis的splitLine&#xff0c;将splitLine的sh…

(十九)数据编辑——属性编辑②

数据编辑——属性编辑② 使用键盘输入值并不是编辑表中值的唯一方式。在某些情况下&#xff0c;为了设置字段值&#xff0c;可能要对单条记录甚至是所有记录执行数学计算。ArcMap 中的字段计算器可以对所有或所选记录进行简单和高级计算。 此外&#xff0c;还可以基于字段计算…

Vue生态及实践 - vuex

目录 Vuex vuex基础 阶段小结&#xff08;vuex的四种对象&#xff09; vuex响应式原理 vuex.js的实现 index.js Module 局部状态 命名空间 跨模块访问数据 小结 目标 Vuex相关基本概念和使用方式vuex响应式原理过程vuex中如何进行模块式开发 Vue2.0是单向数据流的…

H5学习期间 问题文档(更新中)

目录 一、html与css中让标签 二、css鼠标滑入显示div 三、git报错解决方案 四、ul>li中给h1标签设置行高 一、html与css中让标签<li>在同一行显示 li标签一行显示 效果展示&#xff1a; 代码块&#xff1a; <!DOCTYPE html> <html lang"en"…

国内做MES系统的企业哪家好?

什么是MES&#xff1f;国内做MES系统的企业哪家好&#xff1f;下面分为两块跟大家详细讲解。 一、什么是MES&#xff1f; 1、概念&#xff1a; MES&#xff08;英文全称&#xff1a;Manufacturing Execution System&#xff09;制造执行系统&#xff0c;是面向车间生产的管理…

常用调用链等监控对比

1 了解监控 什么是监控&#xff1f; 指对计算机系统、网络、应用程序等进行实时、持续的管理和控制&#xff0c;以确保系统的性能、稳定性和安全性。 具体来说&#xff0c;监控可以通过收集和分析各种指标数据来实现&#xff0c;例如CPU、内存、网络、磁盘等硬件指标&#xf…

NamedPipeClientStream连接远程主机异常的处理

NamedPipeClientStream连接远程主机异常的处理 命名管道通讯测试异常解决方法&#xff1a; 命名管道通讯测试异常 在两个PC主机上测试命名管道通讯&#xff0c;设置服务器IP&#xff0c;初始化客户端时&#xff0c;会报无法访问路径异常。 解决方法&#xff1a; 在Windows功能…

软件测试项目案例去哪找【银行/金融/电商/外卖】

项目经验&#xff08;案例一&#xff09; 项目时间&#xff1a;2016-08 - 2017-07 项目名称&#xff1a;小花钱包&#xff08;Web&#xff09; 项目描述&#xff1a; 项目介绍 这个产品产是互联网金融理财服务平台&#xff0c;既可以发起投标&#xff0c;也可以借款&#xf…

使用Python实现.mat文件转换、读取

目录 一、前言 二、将excel文件转换为mat文件 三、读取mat文件并进行可视化 四、将mat文件转换为excel文件 一、前言 有时候我们拿到一个数据文件不是excel或者csv的怎么办呢&#xff1f;比如&#xff1a;你可恶的合作伙伴测实验数据时&#xff0c;用MATLAB丢给你一个mat…

【mac切换go不同版本】

1.需求是&#xff1a;mac本机想要同时拥有几个版本的go&#xff0c;并可以方便切换 第一种brew link切换失败&#xff0c;手动切换成功 第二种gvm方法失败 第三种docker成功 &#xff08;别看前面啰里八嗦&#xff0c;我只是记录一下&#xff0c;请直接跳到第三个&#xff09; …

【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

代码自取【14.key_tree_pinctrl_gpios_interrupt】&#xff1a; https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数&#xff1a; 1. of_gpio_count&#xff08;获得GPIO的数量&#xff09; static inline int of_gpio_count(struct device_node *np)2. kzalloc…

uniapp项目或者vue项目 封装弹框组件

baseDialog组件代码: <template><view class"base-dialog" v-if"show"><view class"mask"></view><view class"Popmenu" :style"{ width }"><view class"header">{{ title …

怎么做好技术团队规划

一、做规划包括哪些东西 业务结果&#xff1a; 直白说就是业务层面的战绩&#xff0c;你团队打造了一个公司 GMV 占比超过 50%的商城&#xff0c;或者支撑了某个快速发展业务&#xff0c;这些都是业务结果&#xff0c;用业务数字来说话。 技术创新&#xff1a; 由技术人员发起…

【DBA专属】mysql-------->>>MMM高可用集群架构

Mysql---MMM高可用集群架构 目录 MMM安装部署 环境配置&#xff1a;&#xff08;所有主机配置&#xff09; 1、主机信息 2、关闭防火墙 3、同步时区 4、配置主机解析文件 5、配置ssh免密登录 6、所有机器安装epel源 数据库配置&#xff1a; 【所有数据库均做的配置】…

蜣螂优化算法(DBO)优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码

蜣螂优化算法是华大学沈波教授团队&#xff0c;继麻雀搜索算法(Sparrow Search Algorithm&#xff0c;SSA&#xff09;之后&#xff0c;于2022年11月27日又提出的一种全新的群体智能优化算法。已有很多学者将算法用于实际工程问题中&#xff0c;今天咱们用蜣螂优化算法优化一下…

技术干货——Selenium Python使用技巧(二)

目录 进行自动跨浏览器测试 使用CSS定位器 WebElement的HTML源代码 鼠标悬停 关闭标签而不是浏览器 处理下拉菜单 复选框处理 通过CSS选择器选择元素 总结&#xff1a; 进行自动跨浏览器测试 您可能需要在多种情况下针对不同的浏览器&#xff08;例如Firefox&#xff…