zoukankan      html  css  js  c++  java
  • 在Java项目中使用Elasticsearch 6.x (一)对索引的增删改查

    一.项目包含的功能
    1.高亮搜索;
    2.词语自动补全;
    3.分页查询;
    4.复合查询;
    5.对索引的增、删、改、查;
    6.对文档的增、删、改;
    7.搜索结果排序;
    8.其他功能:文件读取(word、txt、pdf)

    二.依赖环境版本
    1.Elasticsearch 6.6.1;
    2.jdk 1.8
    3.前端分页插件:网上找的
    4.elasticsearch-rest-high-level-client 6.6.1
    5.spring boot 2.1.3
    6.kibana 6.6.0

    三.访问路径
    1.项目路径:http://localhost:8080/searchTest.html
    2.kibana路径:http://localhost:5601
    3.Elasticsearch启动检测路径:http://localhost:9200/

    四.页面效果

     

    五.代码
    1.bean实体类
    package com.demo.elasticsearch.bean;
    
    import java.util.Date;
    
    /**
     * @Author: ln
     * @Date: 2019/2/26 08:59
     * @Description:
     */
    public class FileBean {
        //text支持分词搜索的字段有:name,author,content,filePath
        //keyword支持不分词搜索的字段有:name,author
        //suggest支持自动补全搜索的字段有:name,author
        /** 主键id */
        private String id;
        /** 文件名称 */
        private String name;
        /** 作者名称 */
        private String author;
        /** 文件内容 */
        private String content;
        /** 文件路径 */
        private String filePath;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getFilePath() {
            return filePath;
        }
    
        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }
        //不分词搜索
        public String getKeywordName() {
            return this.name;
        }
        public String getKeywordAuthor() {
            return this.author;
        }
        //自动补全
        public String getSuggestName() {
            return this.name;
        }
        public String getSuggestAuthor() {
            return this.author;
        }
    }
    package com.demo.elasticsearch.bean;
    
    /**
     * @Author: ln
     * @Date: 2019/2/26 08:59
     * @Description:
     */
    public class FileBeanQuery {
        /** 文件名称 */
        private String name;
        /** 作者名称 */
        private String author;
        /** 文件内容 */
        private String content;
        /** 文件路径 */
        private String filePath;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getFilePath() {
            return filePath;
        }
    
        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }
    }

      2.controller控制层

    package com.demo.elasticsearch.controller;
    
    import com.demo.elasticsearch.bean.FileBean;
    import com.demo.elasticsearch.bean.FileBeanQuery;
    import com.demo.elasticsearch.bean.FileMapping;
    import com.demo.elasticsearch.service.ElasticsearchService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import java.io.IOException;
    
    /**
     * @Author: ln
     * @Date: 2019/2/22 14:04
     * @Description: elasticsearch demo
     */
    @Controller
    @RequestMapping("/demo")
    public class ElasticsearchController {
    
        @Autowired
        private ElasticsearchService elasticsearchService;
    
    
        /* 创建索引 */
        @RequestMapping("/createIndex")
        @ResponseBody
        public String createIndex(String index, FileMapping mapping) throws IOException {
            String result = elasticsearchService.createIndex(index, mapping);
            return result;
        }
        /* 删除索引 Elasticsearch的版本要与client的版本一致,spring的start版本6.4.3调试失败,6.6.1调试成功 */
        @RequestMapping("/delIndex")
        @ResponseBody
        public String delIndex(String index) throws IOException {
            String result = elasticsearchService.delIndex(index);
            return result;
        }
        /* 新建文档(若索引不存在则新建) */
        @RequestMapping("/putDocument")
        @ResponseBody
        public String putDocument(String index, FileBean fileBean) throws IOException {
            String result = elasticsearchService.putDocument(index, fileBean);
            return result;
        }
        /* 删除文档 */
        @RequestMapping("/delDocument")
        @ResponseBody
        public String delDocument(String index, String id) throws IOException {
            String result = elasticsearchService.delDocument(index, id);
            return result;
        }
        /* 获取文档 */
        @RequestMapping("/getDocument")
        @ResponseBody
        public String getDocument(String index, String id) throws IOException {
            String result = elasticsearchService.getDocument(index, id);
            return result;
        }
        /* 全局搜索 */
        @RequestMapping("/keywordSearch")
        @ResponseBody
        public String keywordSearch(String index, String value,
                                int current, int size) throws IOException {
            String result = elasticsearchService.keywordSearch(index, value, current, size);
            return result;
        }
        /* 复合搜索 TODO:还未调试成功*/
        @RequestMapping("/multiSearch")
        @ResponseBody
        public String multiSearch(String index, FileBeanQuery query,
                                  int current, int size) throws IOException, IllegalAccessException {
            String result = elasticsearchService.multiSearch(index, query, current, size);
            return result;
        }
        /* 高亮搜索(注意QueryBuilders的查询方法) */
        @RequestMapping("/highlightSearch")
        @ResponseBody
        public String highlightSearch(String index, String value, int current, int size) throws IOException {
            String result = elasticsearchService.highlightSearch(index, value, current, size);
            return result;
        }
        /* 词语补全(只能根据前缀补全) */
        @RequestMapping("/suggestSearch")
        @ResponseBody
        public String suggestSearch(String index, String value) throws IOException {
            String result = elasticsearchService.suggestSearch(index, value);
            return result;
        }
        /* 全局搜索 */
        @RequestMapping("/searchAll")
        @ResponseBody
        public String searchAll(String index, int current, int size) throws IOException {
            String result = elasticsearchService.searchAll(index, current, size);
            return result;
        }/* 查询文档总数 */
        @RequestMapping("/countQuery")
        @ResponseBody
        public String countQuery(String index) throws IOException {
            String result = elasticsearchService.countQuery(index);
            return result;
        }
    }

      3.service业务逻辑层

    package com.demo.elasticsearch.service;
    
    import com.demo.elasticsearch.bean.FileBean;
    import com.demo.elasticsearch.bean.FileBeanQuery;
    import com.demo.elasticsearch.bean.FileMapping;
    
    import java.io.IOException;
    
    /**
     * @Author: ln
     * @Date: 2019/2/26 08:59
     * @Description:
     */
    public interface ElasticsearchService {
        /**
         * @Description: 新建索引
         * @Author: ln  2019/3/1 16:51
         * @Param: [index:索引名称]
         **/
        String createIndex(String index, FileMapping mapping) throws IOException;
    
        String delIndex(String index) throws IOException;
    
        String putDocument(String index, FileBean fileBean) throws IOException;
    
        String delDocument(String index, String id) throws IOException;
    
        String getDocument(String index, String id) throws IOException;
    
        String keywordSearch(String index, String value, int current, int size) throws IOException;
    
        String multiSearch(String index, FileBeanQuery query, int current, int size) throws IOException, IllegalAccessException;
    
        String highlightSearch(String index, String value, int current, int size) throws IOException;
    
        String suggestSearch(String index, String value) throws IOException;
    
        String searchAll(String index, int current, int size) throws IOException;
    String countQuery(String index) throws IOException; }
    package com.demo.elasticsearch.service;
    
    import com.alibaba.fastjson.JSON;
    import com.demo.elasticsearch.bean.FileBean;
    import com.demo.elasticsearch.bean.FileBeanQuery;
    import com.demo.elasticsearch.bean.FileMapping;
    import com.demo.elasticsearch.util.AttachmentReader;
    import org.apache.http.HttpHost;
    import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
    import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
    import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse;
    import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
    import org.elasticsearch.action.delete.DeleteRequest;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.get.GetRequest;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.MultiSearchRequest;
    import org.elasticsearch.action.search.MultiSearchResponse;
    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.action.support.master.AcknowledgedResponse;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.client.core.CountRequest;
    import org.elasticsearch.client.core.CountResponse;
    import org.elasticsearch.common.text.Text;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.SearchHits;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
    import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
    import org.elasticsearch.search.suggest.Suggest;
    import org.elasticsearch.search.suggest.SuggestBuilder;
    import org.elasticsearch.search.suggest.SuggestBuilders;
    import org.elasticsearch.search.suggest.SuggestionBuilder;
    import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
    import org.springframework.stereotype.Service;
    
    import java.io.File;
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Author: ln
     * @Date: 2019/2/22 15:37
     * @Description:
     */
    @Service
    public class ElasticsearchServiceImpl implements ElasticsearchService {
    
        RestHighLevelClient client;
    
    
        @Override
        public String createIndex(String index, FileMapping mapping) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            CreateIndexRequest request = new CreateIndexRequest(index);
    
            //索引配置
            request.mapping("doc",
                    "keywordName", "type=keyword", "keywordAuthor", "type=keyword",
                    "suggestName", "type=completion", "suggestAuthor", "type=completion");
    
            CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
            client.close();
            return JSON.toJSONString(createIndexResponse);
        }
    
        @Override
        public String delIndex(String index) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            DeleteIndexRequest request = new DeleteIndexRequest(index);
    
            AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(deleteIndexResponse));
            client.close();
            return JSON.toJSONString(deleteIndexResponse.isAcknowledged());
        }
    
        @Override
        public String putDocument(String index, FileBean fileBean) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            File file = new File(fileBean.getFilePath());
            String content = AttachmentReader.reader(fileBean.getFilePath());
            fileBean.setContent(content);
            fileBean.setName(file.getName());
    
            IndexRequest indexRequest = new IndexRequest(index, "doc", fileBean.getId());
            indexRequest.source(JSON.toJSONString(fileBean), XContentType.JSON);
    
            IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(response));
            client.close();
            return JSON.toJSONString(response.status());
        }
    
        @Override
        public String delDocument(String index, String id) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            DeleteRequest request = new DeleteRequest(index,"doc", id );
            DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(deleteResponse));
            client.close();
            return JSON.toJSONString(deleteResponse.status());
        }
    
        @Override
        public String getDocument(String index, String id) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            GetRequest getRequest = new GetRequest(index,"doc", id );
            GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(getResponse));
            client.close();
            return JSON.toJSONString(getResponse);
        }
    
        @Override
        public String keywordSearch(String index, String value,
                                int current, int size) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(index);
    
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //支持全词搜索的字段有:keywordName,keywordAuthor"
            searchSourceBuilder.query(QueryBuilders.multiMatchQuery(value, "keywordName", "keywordAuthor"));
            searchSourceBuilder.from(current);
            searchSourceBuilder.size(size);
    
            searchRequest.source(searchSourceBuilder);
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(searchResponse));
            //处理返回结果
            List<Map<String, Object>> result = dealResult(searchResponse.getHits());
            client.close();
            return JSON.toJSONString(result);
        }
    
        @Override
        public String multiSearch(String index, FileBeanQuery query,
                                  int current, int size) throws IOException, IllegalAccessException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            MultiSearchRequest request = new MultiSearchRequest();
    
            for (Field field : query.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                if(field.get(query) != null){
                    SearchRequest searchRequest = new SearchRequest(index);
                    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
                    searchSourceBuilder.query(QueryBuilders.boolQuery().must(
                            QueryBuilders.matchQuery(field.getName(), field.get(query))));
                    searchRequest.source(searchSourceBuilder);
                    request.add(searchRequest);
                }
            }
    
            MultiSearchResponse response = client.msearch(request, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(response));
            //返回结果处理
            List<Map<String, Object>> result = new ArrayList<>();
            MultiSearchResponse.Item[] multiSearchResponses = response.getResponses();
            for (MultiSearchResponse.Item multiSearchRespons : multiSearchResponses) {
                SearchHits hits = multiSearchRespons.getResponse().getHits();
                for (SearchHit hit : hits.getHits()) {
                    Map<String, Object> map = hit.getSourceAsMap();
                    if(!result.contains(map)){
                        result.add(map);
                    }
                }
            }
            client.close();
            return JSON.toJSONString(result);
        }
    
        @Override
        public String highlightSearch(String index, String value, int current, int size) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest();
            searchRequest.indices(index);
    
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //高亮,支持所有FileBean实体的字段
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            FileBean fileBean = new FileBean();
            String[] fieldNames = new String[fileBean.getClass().getDeclaredFields().length];
            int i = 0;
            for (Field f : fileBean.getClass().getDeclaredFields()) {
                HighlightBuilder.Field highlight = new HighlightBuilder.Field(f.getName());
                highlight.highlighterType("unified");
                highlightBuilder.field(highlight);
                fieldNames[i] = f.getName();
                i++;
            }
            //设置高亮样式
            highlightBuilder.preTags("<label style="color: red">");
            highlightBuilder.postTags("</label>");
            //添加查询条件
            searchSourceBuilder.highlighter(highlightBuilder);
            searchSourceBuilder.query(QueryBuilders.multiMatchQuery(value, fieldNames));//搜索也支持所有FileBean实体的字段
            searchRequest.source(searchSourceBuilder);
    
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(searchResponse));
            //获取高亮字段
            List<Map<String, Object>> result = new ArrayList<>();
            SearchHits hits = searchResponse.getHits();
            for (SearchHit hit : hits.getHits()) {
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                for (String fieldName : fieldNames) {
                    HighlightField highlight = highlightFields.get(fieldName);
                    System.out.println(fieldName);
                    if(highlight != null){
                        Text[] fragments = highlight.fragments();
                        String fragmentString = fragments[0].string();
                        System.out.println("高亮值:" + fragmentString);
                        Map<String, Object> map = hit.getSourceAsMap();
                        map.put(fieldName, fragmentString);
                        if(!result.contains(map)){
                            result.add(map);
                        }
                    }
                }
            }
            client.close();
            return JSON.toJSONString(result);
        }
    
        @Override
        public String suggestSearch(String index, String value) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest(index);
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            //查询补全词语
            SuggestionBuilder completionName = SuggestBuilders.completionSuggestion("suggestName").text(value);
            SuggestBuilder suggestBuilder = new SuggestBuilder();
            suggestBuilder.addSuggestion("suggestName", completionName);
            SuggestionBuilder completionAuthor = SuggestBuilders.completionSuggestion("suggestAuthor").text(value);
            suggestBuilder.addSuggestion("suggestAuthor", completionAuthor);
    
            searchSourceBuilder.suggest(suggestBuilder);
            searchRequest.source(searchSourceBuilder);
    
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(searchResponse));
            //处理返回结果
            Suggest suggest = searchResponse.getSuggest();
            //支持自动补全搜索的字段有suggestName,suggestAuthor
            CompletionSuggestion termSuggestion = suggest.getSuggestion("suggestName");
            CompletionSuggestion termSuggestionAuthor = suggest.getSuggestion("suggestAuthor");
            List<CompletionSuggestion.Entry> list = termSuggestion.getEntries();
            list.addAll(termSuggestionAuthor.getEntries());
            List<String> suggestList = new ArrayList<>();
            for (CompletionSuggestion.Entry entry : list) {
                for (CompletionSuggestion.Entry.Option option : entry) {
                    String suggestText = option.getText().string();
                    System.out.println("补全的词语:" + suggestText);
                    if(!suggestList.contains(suggestText)){
                        suggestList.add(suggestText);
                    }
                }
            }
            client.close();
            return JSON.toJSONString(suggestList);
        }
    
        @Override
        public String searchAll(String index, int current, int size) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
            SearchRequest searchRequest = new SearchRequest(index);
    
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            searchSourceBuilder.from(current);
            searchSourceBuilder.size(size);
    
            searchRequest.source(searchSourceBuilder);
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(JSON.toJSONString(searchResponse));
            //处理返回结果
            SearchHits hits = searchResponse.getHits();
            client.close();
            return JSON.toJSONString(hits);
        }
    
        @Override
        public String countQuery(String index) throws IOException {
            client = new RestHighLevelClient(
                    RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
            CountRequest countRequest = new CountRequest(index);
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            countRequest.source(searchSourceBuilder);
    
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
            countRequest.source(sourceBuilder);
    
            CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);
            long count = countResponse.getCount();
            return count + "";
    
        }private List<Map<String, Object>> dealResult(SearchHits hits){
            List<Map<String, Object>> result = new ArrayList<>();
            for (SearchHit hit : hits.getHits()) {
                Map<String, Object> map = hit.getSourceAsMap();
                result.add(map);
            }
            return result;
        }
    }

      4.pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.demo</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>elasticsearch</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <poi.version>3.16</poi.version>
            <commonsio.version>2.4</commonsio.version>
            <icepdf>6.2.3</icepdf>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- fastjson 版本1.2.28以前有远程代码漏洞,版本最好是该版本或之后的 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.31</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <version>2.0.9</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>6.6.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>6.6.1</version>
            </dependency>
            <!-- commons -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commonsio.version}</version>
            </dependency>
            <dependency>
                <groupId>org.icepdf.os</groupId>
                <artifactId>icepdf-pro-intl</artifactId>
                <version>${icepdf}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/net.sourceforge.jchardet/jchardet -->
            <dependency>
                <groupId>net.sourceforge.jchardet</groupId>
                <artifactId>jchardet</artifactId>
                <version>1.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.9.2</version>
            </dependency>
            <!-- POI -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>${poi.version}</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

      5.其他工具类

    package com.demo.elasticsearch.util;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.pdfbox.io.RandomAccessBuffer;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;
    import org.apache.poi.extractor.ExtractorFactory;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    /**
     * 文档读取工具,支持word,pdf,txt
     * 2017年9月15日
     */
    public class AttachmentReader {
        private static final String[] WORD= {"doc","docx","xls","xlsx","ppt","pptx"};
        private static final String PDF ="pdf";
        private static final String TXT="txt";
        
        public static String reader(String path) {
            String text = "";
            String type =  path.substring(path.lastIndexOf(".")+1).toLowerCase();
            try {
                if(TXT.equals(type)) {
                    text= txtReader(path);
                } else if(PDF.equals(type)) {
                    text = pdfReader(path);
                } else {
                    for (int i = 0; i < WORD.length; i++) {
                        if(WORD[i].equals(type)){
                            text = wordReader(path);
                        }
                    }
                }
            } catch (Exception e) {
                e.getMessage();
            }
            return text;
        }

    public static String wordReader(String path) { try { return ExtractorFactory.createExtractor(new File(path)).getText(); } catch (Exception e) { System.out.println(path); throw new RuntimeException(e); } } public static String txtReader(String path) { try { File file = new File(path); //文本编码探测 FileCharsetDetector detector = new FileCharsetDetector(); String charset = detector.guessFileEncoding(file, 2); String str = FileUtils.readFileToString(file,charset); return str; } catch (Exception e) { throw new RuntimeException(e); } }

    public static String pdfReader(String path) { String text = ""; FileInputStream is = null; PDDocument document = null; try { is = new FileInputStream(path); PDFParser parser = new PDFParser(new RandomAccessBuffer(is)); parser.parse(); document = parser.getPDDocument(); PDFTextStripper stripper = new PDFTextStripper(); text = stripper.getText(document); } catch (Exception e) { throw new RuntimeException(e); }finally { if(null!=is){ } try { is.close(); } catch (IOException e) { } } return text; } }
    package com.demo.elasticsearch.util;
    
    import org.mozilla.intl.chardet.nsDetector;
    import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
    
    import java.io.*;
    
    /**
     * 字符集探测
     * 2017年9月22日
     */
    public class FileCharsetDetector {
    
        private boolean found = false;
        private String encoding = null;
      
        public String guessFileEncoding(File file) throws FileNotFoundException, IOException {
            return guessFileEncoding(file, new nsDetector());
        }

    public String guessFileEncoding(File file, int languageHint) throws FileNotFoundException, IOException { return guessFileEncoding(file, new nsDetector(languageHint)); }
    private String guessFileEncoding(File file, nsDetector det) throws FileNotFoundException, IOException { // Set an observer... // The Notify() will be called when a matching charset is found. det.Init(new nsICharsetDetectionObserver() { public void Notify(String charset) { encoding = charset; found = true; } }); BufferedInputStream imp = new BufferedInputStream(new FileInputStream(file)); byte[] buf = new byte[1024]; int len; boolean done = false; boolean isAscii = false; while ((len = imp.read(buf, 0, buf.length)) != -1) { // Check if the stream is only ascii. isAscii = det.isAscii(buf, len); if (isAscii) { break; } // DoIt if non-ascii and not done yet. done = det.DoIt(buf, len, false); if (done) { break; } } imp.close(); det.DataEnd(); if (isAscii) { encoding = "ASCII"; found = true; } if (!found) { String[] prob = det.getProbableCharsets(); //这里将可能的字符集组合起来返回 for (int i = 0; i < prob.length; i++) { if (i == 0) { encoding = prob[i]; } else { encoding += "," + prob[i]; } } if (prob.length > 0) { // 在没有发现情况下,也可以只取第一个可能的编码,这里返回的是一个可能的序列 return encoding; } else { return null; } } return encoding; } }

       6.springboot启动类

    package com.demo.elasticsearch;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class ElasticsearchApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ElasticsearchApplication.class, args);
        }
    
    }

      待完善。。。

      

      
  • 相关阅读:
    iOSIPV6简单测试环境搭建
    SQL存儲過程的調試方法
    Excel的 OleDb 连接串的格式
    RequiredFieldValidator的使用
    GridView導出Excel
    咳嗽對症下藥
    WCF基礎
    WCF配置文件全攻略
    WCF寄宿方式
    WCF綁定
  • 原文地址:https://www.cnblogs.com/xyddm/p/10417371.html
Copyright © 2011-2022 走看看