ES全文检索pdf、word、txt等文本文件内容

这篇具有很好参考价值的文章主要介绍了ES全文检索pdf、word、txt等文本文件内容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求:
用ES对上传文件内容的检索和高亮显示。
之前从事于物联网行业,从多年前了解ES以后没有使用过,本篇文章就是为了记录小白用ES完成工作的过程。
Elasticsearch的介绍、安装和环境这里不过多介绍,网上有很多。
思考:
文本关键字搜索,文本需要上传elasticsearch。支持任意格式文件。纯文本文件应该很容易实现,而对于包含图片和文本的文件怎么处理?
es的文本抽取插件可以帮我们实现。
环境介绍:
由于是已有的环境,es版本已经确定好了,elasticsearch 8.6.2,看了一下官方网页,属于很新的版本(这样的版本意味遇到问题不好找原因和解决办法)
es 长文本检索,使用记录,全文检索,elasticsearch

es解析文本需要用到ingest attachment插件解析文件中的文本,需要先把文件转base64,具体官网有介绍https://www.elastic.co/guide/en/elasticsearch/reference/8.7/attachment.html 本次使用的es8.6.2版本已经把插件集成进来了,无需单独下载安装。低版本安装attchment插件:在安装目录下,
./bin/elasticsearch-plugin install ingest-attachment

创建索引库

PUT /file2
{
  "mappings": {
    "properties": {
      "deptId":{
        "type": "long"
      },
      "title":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "summary": {
          "type": "text",
		      "analyzer": "ik_smart"
      },
      "attachment": {
        "properties": {
          "content":{
            "type": "text",
            "analyzer": "ik_smart",
            "index_options" : "offsets"
          }
        }
      }
    }
  }
}

attachment指定抽取解析的文本内容

PUT _ingest/pipeline/attachment
{
  "description" : "Extract attachment information",
  "processors" : [
    {
      "attachment" : {
        "field" : "content",
        "remove_binary": false,
        "indexed_chars" : -1
      }
    }
  ]
}

“field” : “content”,指定文本字段端
“remove_binary”: false,保存base64文件内容 true不保存
“indexed_chars” : -1 不限制解析文件管道流的最大大小,不设置默认100000
因为要使用高亮,选择RestHighLevelClient,所以需要引入依赖

		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>7.17.4</version>
		</dependency>

创建RestHighLevelClient对象

RestHighLevelClient restClient= new RestHighLevelClient(RestClient.builder(new HttpHost(elasticsearchServerIp, elasticsearchServerPort, "http")));

上传文档内容

    @Async
    public void addOrUpdateNew(String fileUrl ,String title,String summary) {
        try {
        	//文件标题
            fileEntity.setTitle(title);
            //文件摘要
            fileEntity.setSummary(summary);
            //判断文件类型
            String fileType = getFileTypeByDefaultTika(fileUrl);
            if (fileType != null) {
                if (!fileType.contains("video") && !fileType.contains("image") && !"application/zip".equals(fileType)) {
                    byte[] bytes = toByteArray(fileUrl);
                    String base64 = Base64.getEncoder().encodeToString(bytes);
                    fileEntity.setContent(base64);
                    fileEntity.setContentType(1);
                    String body = JSON.toJSONString(fileEntity);
                    IndexRequest indexRequest = new IndexRequest(endpoint)
                            .source(body, XContentType.JSON)
  							 //上传同时,使用attachment pipline进行提取文件
                            .setPipeline("attachment").timeout(TimeValue.timeValueMinutes(10));
                    restClient.index(indexRequest, RequestOptions.DEFAULT);
                } else {
                    fileEntity.setContentType(2);
                    String body = JSON.toJSONString(fileEntity);
                    IndexRequest indexRequest = new IndexRequest(endpoint)
                            .source(body, XContentType.JSON);
                    restClient.index(indexRequest, RequestOptions.DEFAULT);
                }
            }
        } catch (Exception e) {
//            e.printStackTrace();
        }
    }

分页、关键字、高亮查询

    /**
     * @param deptId 部门id
     * @param keyword 关键字
     * @param current 当前页
     * @param size 一页条数
     * @return PageVo 封装分页对象
     */
    public PageVo search(Long deptId,String keyword, Integer current, Integer size) {
        PageVo pageVo = new PageVo();
        pageVo.setSize(size);
        pageVo.setCurrent(current);
        try {

            //创建查询对象
            SearchRequest request = new SearchRequest("GET", endpoint);
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
            //设置查询条件
            boolQueryBuilder.filter(QueryBuilders.termsQuery("deptId",deptId))
            		.should(QueryBuilders.matchPhraseQuery("summary", keyword))
                    .should(QueryBuilders.matchPhraseQuery("title", keyword))
                    .should(QueryBuilders.matchPhraseQuery("attachment.content", keyword))
                    .minimumShouldMatch(1);
            //设置高亮
            HighlightBuilder hiBuilder = new HighlightBuilder();
            //设置高亮字段
            HighlightBuilder.Field title = new HighlightBuilder.Field("title");
            HighlightBuilder.Field summary = new HighlightBuilder.Field("summary");
            HighlightBuilder.Field content = new HighlightBuilder.Field("attachment.content");
            hiBuilder.field(title).field(summary).field(content);
            //设置高亮样式
            hiBuilder.preTags("<span style='color:red'>");
            hiBuilder.postTags("</span>");
            hiBuilder.fragmentSize(800000); //最大高亮分片数
            hiBuilder.numOfFragments(0); //从第一个分片获取高亮片段
            List<String> list = new ArrayList<>();
            list.add("content");
            searchSourceBuilder.from((current - 1) * size);
            searchSourceBuilder.size(size);
//            searchSourceBuilder.sort("_id", SortOrder.DESC);
            searchSourceBuilder.query(boolQueryBuilder).highlighter(hiBuilder)
                    //字段过滤  content字段是base64 影响查询速度 第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
                    .fetchSource(null, list.toArray(new String[list.size()]));
            //指定聚合条件
            request.source(searchSourceBuilder);
            //IndicesOptions.fromOptions的参数
            //ignore_unavailable :是否忽略不可用的索引
            //allow_no_indices:是否允许索引不存在
            //expandToOpenIndices :通配符表达式将扩展为打开的索引
            //expandToClosedIndices :通配符表达式将扩展为关闭的索引
            request.indicesOptions(IndicesOptions.fromOptions(true, true, true, false));
            //查询到搜索结果
            SearchResponse search = restClient.search(request, RequestOptions.DEFAULT);
            //获取结果中的高亮对象
            SearchHits hits1 = search.getHits();
            //获取高亮总条数
            TotalHits totalHits = hits1.getTotalHits();
            //设置分页总条数
            pageVo.setTotal((int) totalHits.value);
            SearchHit[] hits = search.getHits().getHits();
            List<KnowledgeFile> ret = new ArrayList<>();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                KnowledgeFile parsedObject = JSONObject.parseObject(sourceAsString, KnowledgeFile.class);
                Map map = JSONObject.parseObject(sourceAsString, Map.class);
                JSONObject attachment = (JSONObject) map.get("attachment");
                if (attachment != null && parsedObject.getContentType() != 2) {
                    Map map2 = JSONObject.parseObject(attachment.toJSONString(), Map.class);
                    String content1 = (String) map2.get("content");
                    parsedObject.setContent(content1);
                }
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                KnowledgeFile knowledgeFile = new KnowledgeFile();
                if (highlightFields.get("title") != null) {
                    String highlightTitle = highlightFields.get("title").getFragments()[0].toString();
                    knowledgeFile.setTitle(highlightTitle);
                } else {
                    knowledgeFile.setTitle(parsedObject.getTitle());
                }
                if (highlightFields.get("summary") != null) {
                    String highlightSummary = highlightFields.get("summary").getFragments()[0].toString();
                    knowledgeFile.setSummary(highlightSummary);
                } else {
                    knowledgeFile.setSummary(parsedObject.getSummary());
                }
                if (parsedObject.getContentType() != 2) {
                    if (highlightFields.get("attachment.content") != null) {
                        String highlightContent = highlightFields.get("attachment.content").getFragments()[0].toString();
                        knowledgeFile.setContent(highlightContent.replaceAll("\\n", "<br/>"));
                    } else {
                        if (parsedObject.getContent() != null) {
                            knowledgeFile.setContent(parsedObject.getContent().replaceAll("\\n", "<br/>"));
                        }
                    }
                    knowledgeFile.setContentType(parsedObject.getContentType());
                } else {
                    knowledgeFile.setContentType(parsedObject.getContentType());
                }
                Map fileMap = JSONObject.parseObject(parsedObject.getFile(), Map.class);
                knowledgeFile.setFileName(String.valueOf(fileMap.get("fileName")));
                knowledgeFile.setFileUrl(String.valueOf(fileMap.get("fileUrl")));
                knowledgeFile.setFilePath(String.valueOf(fileMap.get("filePath")));
                ret.add(knowledgeFile);
            }

            pageVo.setResult(ret);
            return pageVo;
        } catch (Exception e) {
//            e.printStackTrace();
            return null;
        }
    }

写到这里基本就可以正常插入,查询了。文章来源地址https://www.toymoban.com/news/detail-847242.html

到了这里,关于ES全文检索pdf、word、txt等文本文件内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全文检索-Es-初步检索(三)

    #为jmeter返回的结果 jmeter测试结果 请求头 http请求 put 返回结果 再次发送请求 post不带/带id保存 不带id 结果 二次请求结果 带id保存 结果 二次请求结果 结论 发送请求 查询-查看结果树 增加判断,确定是否修改 结果 查看修改是否成功 结果 更新文档 post/put带_update的请求(会比

    2024年02月14日
    浏览(43)
  • 大文本的全文检索方案附件索引

    Elasticsearch 附件索引是需要插件支持的功能,它允许将文件内容附加到 Elasticsearch 文档中,并对这些附件内容进行全文检索。本文将带你了解索引附件的原理和使用方法,并通过一个实际示例来说明如何在 Elasticsearch 中索引和检索文件附件。 索引附件的核心原理是通过 Inges

    2024年02月12日
    浏览(33)
  • ES(Elasticsearch 全文检索)

    数据量大的时候 索引失效 =查询性能低 功能比较弱 对文档的内容进行分词,对词条创建索引,记录词条所在的文档信息根据词条查询到文档的id 从而查到文档 文档:每一条数据就是一条文档 词条:文档按照语义分成的词语 正向索引 根据文档的id创建索引 查询词条必须先找

    2024年02月05日
    浏览(56)
  • 全文检索[ES系列] - 第495篇

    历史文章( 文章 累计490+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 Mybatis-Plus通用枚举功能 [MyBatis-Plus系列

    2024年02月04日
    浏览(59)
  • ES+微服务对文档进行全文检索

    打开ES服务 进入es安装目录下F:elasticsearch-7.17.1bin,双击elasticsearch.bat,如图 成功后,如图 2. 打开ES可视化服务 进入安装F:elasticsearch-head-master路径下,执行npm run start 3. 打开浏览器 参考文献:https://blog.csdn.net/mjl1125/article/details/121975950

    2024年02月11日
    浏览(42)
  • 商城-学习整理-高级-全文检索-ES(九)

    https://www.elastic.co/cn/what-is/elasticsearch Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 REST API:天然的跨平台。 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/cur

    2024年02月12日
    浏览(46)
  • MySQL全文检索临时代替ES实现快速搜索

    引入 在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。 从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。 全文索引只支持InnoDB和MyISAM引擎,支持的类型为C

    2024年02月07日
    浏览(48)
  • 第八章 全文检索【上】+商品添加ES + 商品热度排名

    根据用户输入的检索条件,查询出对用的商品 首页的分类  搜索栏 1.3.1 建立mapping! 这时我们要思考三个问题: 哪些字段需要分词  例如:商品名称 我们用哪些字段进行过滤 平台属性值 分类Id 品牌Id 哪些字段我们需要通过搜索查询出来。 商品名称,价格,图片等。 以上分析

    2024年02月09日
    浏览(36)
  • 【ElasticSearch-基础篇】ES高级查询Query DSL全文检索

    和术语级别查询(Term-Level Queries)不同,全文检索查询(Full Text Queries)旨在 基于相关性搜索和匹配文本数据 。这些查询会对输入的文本进行分析,将其 拆分 为词项(单个单词),并执行诸如分词、词干处理和标准化等操作。 全文检索的关键特点: 对输入的文本进行分析

    2024年01月22日
    浏览(51)
  • JavaEE & 文件操作和IO & 目录扫描全文检索小程序

    不知道说啥了,看看吧 在之前的学习中,基本上都是围绕内存展开的~ MySQL 主要是操作硬盘的 文件IO也是是操作硬盘的~ IO : i nput o utput 创造文件,删除文件,重命名文件,创建目录······ 一些操作没有权限也做不了~ 1.1 路径 就是我们的文件系统上的一个文件/ 目录 的具

    2023年04月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包