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

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

这里是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

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

        }
    }


    return files;
}


FileEntity




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-H8VeAEod-1713173839364)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值