最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于SpringBoot+ElasticSearch實現(xiàn)文檔智能化檢索的完整指南

 更新時間:2025年08月01日 09:14:37   作者:墨夶  
Spring Boot是一個用來快速開發(fā)、運行和部署 Spring 應(yīng)用程序的框架,Elasticsearch是一個開源的、分布式的全文搜索,本文給大家介紹了基于SpringBoot+ElasticSearch實現(xiàn)文檔智能化檢索的完整指南,需要的朋友可以參考下

一、項目背景與技術(shù)選型

在企業(yè)級應(yīng)用中,文檔內(nèi)容的智能化檢索是一個高頻需求。例如:

  • 上傳PDF/Word文檔后自動抽取文本
  • 支持中文分詞和模糊匹配
  • 搜索結(jié)果高亮顯示關(guān)鍵詞

技術(shù)選型

技術(shù)作用
SpringBoot快速構(gòu)建微服務(wù)
ElasticSearch實現(xiàn)全文檢索與高亮功能
Jieba分詞插件中文分詞支持
Ingest Attachment Processor Plugin文檔內(nèi)容抽?。≒DF/Word等)

二、環(huán)境準備

2.1 Maven依賴配置

<!-- pom.xml -->
<dependencies>
    <!-- SpringBoot基礎(chǔ) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Elasticsearch連接 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

    <!-- 文件處理工具 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>

    <!-- Jieba分詞插件 -->
    <dependency>
        <groupId>com.nlp</groupId>
        <artifactId>elasticsearch-analysis-jieba</artifactId>
        <version>7.17.0</version>
    </dependency>
</dependencies>

2.2 配置文件

# application.yml
spring:
  data:
    elasticsearch:
      cluster-name: my-cluster
      cluster-nodes: localhost:9200
  elasticsearch:
    rest:
      uris: http://localhost:9200
      username: elastic
      password: your_password

三、核心功能實現(xiàn)步驟

3.1 安裝ElasticSearch插件

Ingest Attachment Processor Plugin

# 安裝插件(本地ES)
elasticsearch-plugin install ingest-attachment

# 安裝插件(Docker容器內(nèi))
docker exec -it elasticsearch bin/elasticsearch-plugin install ingest-attachment

注意:確保插件版本與ES版本匹配!重啟ES后生效。

Jieba中文分詞插件

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-jieba/releases/download/v7.17.0/elasticsearch-analysis-jieba-7.17.0.zip

3.2 創(chuàng)建文檔抽取管道

ElasticSearch的Ingest Pipeline用于自動化處理上傳的文件內(nèi)容。

3.2.1 定義Pipeline

PUT _ingest/pipeline/attachment-extract
{
  "description": "Extract attachment content",
  "processors": [
    {
      "attachment": {
        "field": "content",
        "target_field": "attachment",
        "ignore_missing": true
      }
    },
    {
      "remove": {
        "field": "content"
      }
    }
  ]
}

關(guān)鍵點

  • attachment處理器將Base64編碼的文件內(nèi)容解析為文本。
  • remove處理器刪除原始二進制字段,保留提取后的文本。

3.3 定義索引與映射

索引的mappingsettings決定了數(shù)據(jù)存儲格式和分詞規(guī)則。

3.3.1 創(chuàng)建索引

PUT /fileinfo
{
  "mappings": {
    "properties": {
      "id": { "type": "keyword" },
      "fileName": { "type": "text" },
      "fileType": { "type": "keyword" },
      "attachment": {
        "properties": {
          "content": { "type": "text", "analyzer": "jieba" }  // 使用Jieba分詞
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "jieba": {
          "type": "custom",
          "tokenizer": "jieba_tokenizer"
        }
      }
    }
  }
}

注意:attachment.content字段必須使用分詞器,否則全文檢索會失??!

3.4 Java代碼實現(xiàn)文檔處理

3.4.1 文件上傳接口

@RestController
@RequestMapping("/api/files")
public class FileUploadController {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @PostMapping("/upload")
    public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        // 1. 文件轉(zhuǎn)Base64
        String base64Content = Base64.getEncoder().encodeToString(file.getBytes());

        // 2. 構(gòu)造文檔對象
        Map<String, Object> document = new HashMap<>();
        document.put("id", UUID.randomUUID().toString());
        document.put("fileName", file.getOriginalFilename());
        document.put("fileType", getFileType(file.getOriginalFilename()));
        document.put("content", base64Content);  // 二進制字段

        // 3. 使用Pipeline處理并索引文檔
        IndexRequest request = new IndexRequest("fileinfo")
                .setId(document.get("id").toString())
                .setPipeline("attachment-extract")  // 關(guān)鍵:綁定Pipeline
                .setSource(document);

        elasticsearchRestTemplate.index(request);

        return ResponseEntity.ok("文件已成功索引");
    }

    private String getContentType(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (originalFilename.endsWith(".pdf")) {
            return "application/pdf";
        } else if (originalFilename.endsWith(".docx")) {
            return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        }
        return "application/octet-stream";
    }
}

代碼解析

  • Base64.getEncoder() 將文件轉(zhuǎn)為Base64字符串,便于傳輸。
  • setPipeline("attachment-extract") 調(diào)用預(yù)定義的Pipeline處理內(nèi)容。
  • elasticsearchRestTemplate.index() 執(zhí)行索引操作。

3.5 全文檢索與高亮分詞

3.5.1 搜索接口

@GetMapping("/search")
public ResponseEntity<Map<String, Object>> searchFiles(@RequestParam String keyword) {
    // 1. 構(gòu)建查詢
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchQuery("attachment.content", keyword)
            .analyzer("jieba")  // 使用Jieba分詞
            .fuzziness("AUTO"));

    // 2. 啟用高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("attachment.content").preTags("<mark>").postTags("</mark>");
    sourceBuilder.highlighter(highlightBuilder);

    // 3. 執(zhí)行搜索
    SearchRequest searchRequest = new SearchRequest("fileinfo");
    searchRequest.source(sourceBuilder);
    SearchResponse response = elasticsearchRestTemplate.search(searchRequest);

    // 4. 提取高亮結(jié)果
    List<Map<String, Object>> results = new ArrayList<>();
    for (SearchHit hit : response.getHits().getHits()) {
        Map<String, Object> source = hit.getSourceAsMap();
        Map<String, HighlightField> highlights = hit.getHighlightFields();
        HighlightField contentHighlight = highlights.get("attachment.content");
        if (contentHighlight != null) {
            source.put("highlight", contentHighlight.fragments()[0].string());
        }
        results.add(source);
    }

    return ResponseEntity.ok(Collections.singletonMap("results", results));
}

關(guān)鍵點

  • matchQuery("attachment.content", keyword) 對內(nèi)容字段進行分詞匹配。
  • HighlightBuilder 控制高亮標簽(如<mark>)。
  • 搜索結(jié)果中highlight字段包含高亮片段。

四、性能優(yōu)化與注意事項

4.1 緩存策略

  • ElasticSearch緩存:啟用request_cache減少重復(fù)查詢開銷。
  • 應(yīng)用層緩存:使用Redis緩存高頻搜索結(jié)果。

4.2 分頁與過濾

// 分頁示例
sourceBuilder.from(0).size(10);  // 限制每頁10條
sourceBuilder.sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));  // 按時間排序

4.3 安全與容錯

  • 文件類型校驗:防止非法文件上傳。
  • 異常處理:捕獲ElasticsearchException并返回友好的錯誤信息。

五、代碼整合

5.1 配置類(ElasticSearch連接)

@Configuration
public class ElasticsearchConfig {

    @Value("${spring.elasticsearch.rest.uris}")
    private String esUri;

    @Bean
    public RestHighLevelClient elasticsearchClient() {
        return new RestHighLevelClient(
                RestClient.builder(new HttpHost(esUri.split(":")[0], Integer.parseInt(esUri.split(":")[1]), "http")));
    }

    @Bean
    public ElasticsearchRestTemplate elasticsearchRestTemplate(RestHighLevelClient client) {
        return new ElasticsearchRestTemplate(client);
    }
}

5.2 高亮結(jié)果返回示例

{
  "results": [
    {
      "id": "123",
      "fileName": "進口紅酒.pdf",
      "fileType": "pdf",
      "attachment": {
        "content": "這款紅酒產(chǎn)自法國波爾多地區(qū),口感醇厚..."
      },
      "highlight": "這款紅酒產(chǎn)自法國波爾多地區(qū),<mark>口感醇厚</mark>..."
    }
  ]
}

六、從零到一的文檔搜索閉環(huán)

步驟核心代碼/配置作用
1. 依賴配置pom.xml引入ElasticSearch和分詞插件
2. 管道定義PUT _ingest/pipeline/attachment-extract自動抽取文件內(nèi)容
3. 索引映射PUT /fileinfo定義字段類型和分詞規(guī)則
4. 文件上傳FileUploadController.uploadFile()將文件轉(zhuǎn)為Base64并索引
5. 全文搜索FileUploadController.searchFiles()使用Jieba分詞和高亮

七、行動號召:立即動手實踐!

“文檔檢索不再是難題!現(xiàn)在就搭建你的智能搜索系統(tǒng)!”

  1. 嘗試基礎(chǔ)功能:上傳一個PDF并驗證內(nèi)容抽取是否成功。
  2. 挑戰(zhàn)分詞優(yōu)化:自定義Jieba分詞詞典,提升匹配準確率。
  3. 擴展搜索維度:添加按文件類型、時間范圍的過濾功能。

以上就是基于SpringBoot+ElasticSearch實現(xiàn)文檔智能化檢索的完整指南的詳細內(nèi)容,更多關(guān)于SpringBoot ElasticSearch文檔檢索的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA中JSONObject對象和Map對象之間的相互轉(zhuǎn)換

    JAVA中JSONObject對象和Map對象之間的相互轉(zhuǎn)換

    這篇文章主要介紹了JAVA中JSONObject對象和Map對象之間的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JavaSE詳細講解異常語法

    JavaSE詳細講解異常語法

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會根據(jù)身體情況選擇喝開水、吃藥、看病、等 異常處理方法。 java異常處理機制是我們java語言使用異常處理機制為程序提供了錯誤處理的能力,程序出現(xiàn)的錯誤,程序可以安全的退出,以保證程序正常的運行等
    2022-05-05
  • 2023最新版本idea用maven新建web項目(親測不報錯)

    2023最新版本idea用maven新建web項目(親測不報錯)

    這篇文章主要給大家介紹了關(guān)于2023最新版本idea用maven新建web項目,Maven是當(dāng)今Java開發(fā)中主流的依賴管理工具,文中介紹的步驟親測不報錯,需要的朋友可以參考下
    2023-07-07
  • Java設(shè)計模式之模板方法模式Template Method Pattern詳解

    Java設(shè)計模式之模板方法模式Template Method Pattern詳解

    在我們實際開發(fā)中,如果一個方法極其復(fù)雜時,如果我們將所有的邏輯寫在一個方法中,那維護起來就很困難,要替換某些步驟時都要重新寫,這樣代碼的擴展性就很差,當(dāng)遇到這種情況就要考慮今天的主角——模板方法模式
    2022-11-11
  • java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例

    java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例

    這篇文章主要為大家介紹了java實現(xiàn)1M圖片壓縮優(yōu)化到100kb示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 如何在mybatis中向BLOB字段批量插入數(shù)據(jù)

    如何在mybatis中向BLOB字段批量插入數(shù)據(jù)

    這篇文章主要介紹了如何在mybatis中向BLOB字段批量插入數(shù)據(jù)的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • EJB輕松進階之一

    EJB輕松進階之一

    EJB輕松進階之一...
    2006-12-12
  • Spring MVC中日期格式轉(zhuǎn)換的兩種實用方法

    Spring MVC中日期格式轉(zhuǎn)換的兩種實用方法

    在開發(fā)基于 Spring MVC 的 Web 應(yīng)用時,日期格式的轉(zhuǎn)換是一個常見的需求,本文將詳細介紹 Spring MVC 中兩種日期格式轉(zhuǎn)換的方法,包括創(chuàng)建過程和最終的運行結(jié)果,需要的朋友可以參考下
    2025-08-08
  • Java Calendar類的時間操作

    Java Calendar類的時間操作

    這篇文章主要為大家詳細介紹了Java Calendar類的時間操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 從java8升級java17的一些調(diào)整總結(jié)

    從java8升級java17的一些調(diào)整總結(jié)

    在過去的幾年里,Java經(jīng)歷了多次版本升級,從JDK8到JDK17,每一次升級都帶來了許多新的特性和改進,這篇文章主要介紹了從java8升級java17的一些調(diào)整,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-03-03

最新評論

漳浦县| 陈巴尔虎旗| 长海县| 天津市| 百色市| 黔江区| 汶川县| 宁夏| 新丰县| 新巴尔虎左旗| 宁乡县| 中西区| 龙口市| 藁城市| 南溪县| 榆社县| 繁峙县| 锡林浩特市| 濮阳县| 原阳县| 刚察县| 上犹县| 定日县| 灵丘县| 宜兴市| 铅山县| 会同县| 信宜市| 北流市| 崇左市| 普宁市| 吴川市| 顺平县| 共和县| 繁昌县| 沁源县| 西林县| 宁津县| 朝阳县| 安岳县| 南郑县|