当前位置:   article > 正文

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

elasticsearch pdf

首先要明确的一点就是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

请求体:

  1. {
  2. "title":"小米手机1",
  3. "category":"小米1",
  4. "image":"www.yy.com",
  5. "price":3999.00
  6. }

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

返回结果:

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

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

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

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

127.0.0.1:9200/test/_doc/nFez2IgBadwYgUd60r2A

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

返回值:
 

  1. {
  2. "_index": "test",
  3. "_type": "_doc",
  4. "_id": "nFez2IgBadwYgUd60r2A",
  5. "_version": 1,
  6. "_seq_no": 1,
  7. "_primary_term": 1,
  8. "found": true,
  9. "_source": {
  10. "title": "小米手机1",
  11. "category": "小米1",
  12. "image": "www.yy.com",
  13. "price": 3999.00
  14. }
  15. }

 然后删除某一条数据:

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

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

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

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

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

127.0.0.1:9200/test/_delete_by_query

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

请求体:

  1. {
  2. "query": {
  3. "match_all": {}
  4. }
  5. }

 返回值:

  1. {
  2. "took": 133,
  3. "timed_out": false,
  4. "total": 1,
  5. "deleted": 1,
  6. "batches": 1,
  7. "version_conflicts": 0,
  8. "noops": 0,
  9. "retries": {
  10. "bulk": 0,
  11. "search": 0
  12. },
  13. "throttled_millis": 0,
  14. "requests_per_second": -1.0,
  15. "throttled_until_millis": 0,
  16. "failures": []
  17. }

4.打开管道

  1. curl -X PUT "localhost:9200/_ingest/pipeline/attachment" -d '{
  2. "description" : "Extract attachment information",
  3. "processors":[
  4. {
  5. "attachment":{
  6. "field":"data",
  7. "indexed_chars" : -1,
  8. "ignore_missing":true
  9. }
  10. },
  11. {
  12. "remove":{"field":"data"}
  13. }]}'
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

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alibaba.fastjson2</groupId>
  7. <artifactId>fastjson2</artifactId>
  8. <version>2.0.26</version>
  9. </dependency>

上传方法

  1. public AjaxResult upload(MultipartFile file) {
  2. if (file.isEmpty()) {
  3. // 处理文件为空的情况
  4. AjaxResult.error("文件为空!");
  5. }
  6. String uploadPath = "H:/esupload/";
  7. try {
  8. String fileName = file.getOriginalFilename();
  9. String[] nameArray=fileName.split("\\.");
  10. //todo 如果以后要用的Demo一定要修改这里!这里只是为了快速测试,没有写业务代码
  11. if(nameArray.length!=2){
  12. return null;
  13. }
  14. String prefix=nameArray[0];
  15. String suffix=nameArray[1];
  16. long fileSize=file.getSize();
  17. String filePath = uploadPath + File.separator + UUID.randomUUID()+"."+suffix;
  18. // 保存文件到指定路径
  19. file.transferTo(new File(filePath));
  20. //将文件传到es上
  21. HttpClient httpClient = HttpClients.createDefault();
  22. try {
  23. // 设置 Elasticsearch 主机和端口
  24. String elasticHost = "http://127.0.0.1";
  25. int elasticPort = 9200;
  26. // 设置索引名称
  27. String indexName = "book";
  28. // 指定要索引的文档路径
  29. String documentPath = filePath; // 替换为实际的文档路径
  30. // 读取文档内容并进行 Base64 编码
  31. byte[] documentData = Files.readAllBytes(Paths.get(documentPath));
  32. String encodedDocument = Base64.getEncoder().encodeToString(documentData);
  33. // 创建文档 JSON
  34. //String documentJson = String.format("{\"data\":\"%s\"}", encodedDocument);
  35. String documentJson = String.format("{\"data\":\"%s\", \"prefix\":\"%s\", \"suffix\":\"%s\", \"filesize\":%d}",
  36. encodedDocument, prefix, suffix, fileSize); // 创建 POST 请求
  37. HttpPost postRequest = new HttpPost(String.format("%s:%d/%s/_doc?pipeline=attachment", elasticHost, elasticPort, indexName));
  38. // 设置请求主体为 JSON 格式
  39. HttpEntity entity = new StringEntity(documentJson, ContentType.APPLICATION_JSON);
  40. postRequest.setEntity(entity);
  41. /* postRequest.setEntity(entity);*/
  42. // 发送请求
  43. HttpResponse response = httpClient.execute(postRequest);
  44. // 处理响应
  45. String responseBody = EntityUtils.toString(response.getEntity());
  46. System.out.println(responseBody);
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. } finally {
  50. }
  51. // 处理文件上传成功的情况
  52. return AjaxResult.success("上传成功!");
  53. } catch (IOException e) {
  54. // 处理文件上传失败的情况
  55. return AjaxResult.error("系统异常!");
  56. }
  57. }

列表方法

  1. public List<FileEntity> getList(HttpServletResponse response, String matchName, String searchValue) {
  2. if (StringUtils.isEmpty(matchName)) {
  3. matchName = "attachment.content";
  4. }
  5. List<FileEntity> files = new ArrayList<>();
  6. // 创建 Elasticsearch 客户端,用于信息查询
  7. RestHighLevelClient client = new RestHighLevelClient(
  8. RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
  9. try {
  10. // 设置要查询的索引名称
  11. String indexName = "book";
  12. // 构建查询请求
  13. SearchRequest searchRequest = new SearchRequest(indexName);
  14. // 构建查询条件
  15. /* MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("attachment.content", searchValue);
  16. */
  17. if (StringUtils.isEmpty(searchValue)) {
  18. searchValue = "silan";
  19. // 使用TermQueryBuilder进行精确匹配
  20. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  21. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  22. searchSourceBuilder.size(10); // 设置返回的文档数量,默认为 10
  23. searchSourceBuilder.timeout(TimeValue.timeValueSeconds(10)); // 设置超时时间
  24. }else {
  25. MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery(matchName, searchValue);
  26. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  27. boolQueryBuilder.must(matchPhraseQueryBuilder);
  28. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQueryBuilder);
  29. searchRequest.source(sourceBuilder);
  30. }
  31. // 设置排序规则
  32. /* sourceBuilder.sort("_source.content", SortOrder.ASC);*/
  33. // 设置分页
  34. /* int from = 0; // 开始索引
  35. int size = 10; // 返回结果数量
  36. sourceBuilder.from(from);
  37. sourceBuilder.size(size);*/
  38. // 发起查询请求
  39. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  40. // 处理查询结果
  41. SearchHits hits = searchResponse.getHits();
  42. for (SearchHit hit : hits) {
  43. Map<String, Object> sourceAsMap = hit.getSourceAsMap();
  44. String id = hit.getId();
  45. String source = hit.getSourceAsString();
  46. try {
  47. // 将 JSON 字符串转换为 JSONObject
  48. JSONObject jsonObject = JSONObject.parseObject(source);
  49. // 访问 JSONObject 的属性
  50. String data = jsonObject.getString("data");
  51. JSONObject attachment = jsonObject.getJSONObject("attachment");
  52. String contentType = attachment.getString("content_type");
  53. String contentLength = attachment.getString("content_length");
  54. String content = attachment.getString("content");
  55. String author = attachment.getString("author");
  56. String prefix = jsonObject.getString("prefix");
  57. String suffix = jsonObject.getString("suffix");
  58. String filesize = jsonObject.getString("filesize");
  59. FileEntity fileEntity = new FileEntity();
  60. fileEntity.setId(id);
  61. fileEntity.setData(data);
  62. fileEntity.setName(prefix+"."+suffix);
  63. fileEntity.setType(contentType);
  64. fileEntity.setSize(filesize + "字节");
  65. fileEntity.setAuthor(author);
  66. fileEntity.setContent(content.substring(0, Math.min(content.length(), 300)));
  67. fileEntity.setUploadTime(new Date());
  68. files.add(fileEntity);
  69. // 打印结果
  70. System.out.println("Data: " + data);
  71. System.out.println("Content Type: " + contentType);
  72. System.out.println("Content: " + content);
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. }
  76. }
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. } finally {
  80. try {
  81. client.close();
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. return files;
  87. }
FileEntity
  1. @Getter
  2. @Setter
  3. public class FileEntity {
  4. private String id;
  5. private String name;
  6. private String type;
  7. private String author;
  8. private String content;
  9. private Date uploadTime;
  10. private String size;
  11. private String data;
  12. }

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号