解決 Spring Boot 對 Elasticsearch 字段沒有小駝峰映射的問題

場景重現

在使用 MyBatis/Mybatis-Plus 框架對 MySQL 操作時習慣了字段名小駝峰映射,然而在操作 Elasticsearch 時發現字段名沒有小駝峰映射。

解決方法

1. 使用 `ObjectMapper` 手動轉換:
這是最直接也最常用的方法。 在 Spring Boot 應用中使用 `ObjectMapper` 將從 Elasticsearch 獲取的數據進行轉換,將下劃線命名轉換為小駝峰命名。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class ElasticsearchService {@Autowiredprivate ObjectMapper objectMapper; // 通過 @Bean 配置 ObjectMapperpublic Map<String, Object> getDocument(String index, String id) {// 假設你已經有了從 Elasticsearch 獲取文檔的方法,這里是模擬Map<String, Object> document = new HashMap<>();document.put("first_name", "John");document.put("last_name", "Doe");// 將下劃線命名轉換為小駝峰命名ObjectMapper snakeCaseMapper = new ObjectMapper();snakeCaseMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);ObjectMapper camelCaseMapper = new ObjectMapper();camelCaseMapper.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE);try {String jsonString = snakeCaseMapper.writeValueAsString(document);return camelCaseMapper.readValue(jsonString, Map.class);} catch (Exception e) {// 處理異常e.printStackTrace();return null;}}
}

解釋:
? `ObjectMapper` 配置: 在 Spring Boot 應用中,你需要配置一個 `ObjectMapper` Bean。
? `PropertyNamingStrategy`: 通過設置 `PropertyNamingStrategy`,`ObjectMapper` 可以自動將下劃線命名轉換為小駝峰命名。 這里先使用`snakeCaseMapper`讀取,再使用`camelCaseMapper`寫出。
? 轉換過程: 從 Elasticsearch 獲取的數據(`Map`)使用 `ObjectMapper`序列化成 JSON 字符串,然后再反序列化成 `Map`。 在這個過程中,`PropertyNamingStrategy` 會自動進行命名轉換。

配置 `ObjectMapper` Bean:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ObjectMapperConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();// 可以根據需要配置 ObjectMapper 的其他屬性return objectMapper;}
}


2. 使用 Elasticsearch 的 `field_alias` (推薦但ES版本要支持):
從 Elasticsearch 7.0 開始,引入了 `field_alias`。 你可以利用這個功能,在 Elasticsearch 索引的 Mapping 中定義字段別名,將下劃線命名的字段映射到小駝峰命名的字段。

PUT my_index
{"mappings": {"properties": {"first_name": {"type": "alias","path": "first_name"},"last_name": {"type": "alias","path": "last_name"}}}
}

注意: `field_alias` 只是別名,它仍然需要你存儲實際的下劃線命名的字段。 這樣做的好處是,你可以在查詢時使用小駝峰命名,但底層存儲仍然是下劃線命名。


3. 自定義 Elasticsearch 客戶端 (不推薦):

你可以自定義 Elasticsearch 客戶端,攔截響應結果,并手動進行字段命名轉換。 這通常比較復雜,需要你深入了解 Elasticsearch 客戶端的內部機制。不建議使用這種方法,因為它維護成本高。


4. 定義 DTO 類并使用 `@JsonProperty` 注解:

創建一個 DTO 類,對應 Elasticsearch 中的文檔結構,并在 DTO 類的字段上使用 `@JsonProperty` 注解,將 Elasticsearch 的字段名映射到 DTO 類的字段上。

import com.fasterxml.jackson.annotation.JsonProperty;public class UserDTO {@JsonProperty("first_name")private String firstName;@JsonProperty("last_name")private String lastName;// Getters and setters
}

然后,從 Elasticsearch 獲取數據后,將數據映射到 `UserDTO` 對象。


5. 使用 Elasticsearch 插件 (不推薦):

有一些第三方 Elasticsearch 插件可以自動進行字段命名轉換。 但使用插件會增加系統的復雜性,并且可能存在兼容性問題,因此不建議使用。

選擇哪種方法?

  • 優先考慮?field_alias?(如果你的 Elasticsearch 版本支持):?它是最優雅的解決方案,對現有代碼的改動最小。
  • ObjectMapper?手動轉換:?如果你無法修改 Elasticsearch 的 Mapping,那么使用?ObjectMapper?是一個不錯的選擇。 它簡單易用,并且可以靈活地控制轉換過程。
  • @JsonProperty?注解:?如果你的數據結構相對固定,并且需要將其映射到 DTO 對象,那么使用?@JsonProperty?注解是一個好主意。
  • 避免自定義客戶端和插件:?除非你有非常特殊的需求,否則不建議使用自定義客戶端和插件,因為它們維護成本很高。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912959.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Error:Cannot find module ‘chokidar‘

錯誤復現 在vue開發中&#xff0c;出現報錯&#xff1a;Error&#xff1a;Cannot find module ‘chokidar’ 原因 缺包導致 解決方案 直接安裝依賴包 npm install chokidar依舊無效&#xff0c;刪除node_modules重新安裝 rm -rf node_modules npm i

Spring AI 向量數據庫詳解與 RAG 簡單實戰項目

一、什么是向量數據庫&#xff1f; 向量數據庫用于存儲、檢索稠密語義向量&#xff08;Embedding&#xff09;&#xff0c;是構建 RAG&#xff08;檢索增強生成&#xff09;系統的核心組件。它支持近似最近鄰搜索&#xff08;ANN&#xff09;&#xff0c;可根據語義相似度找出…

【RK3568+PG2L50H開發板實驗例程】Linux部分/FPGA FSPI 通信案例

本原創文章由深圳市小眼睛科技有限公司創作&#xff0c;版權歸本公司所有&#xff0c;如需轉載&#xff0c;需授權并注明出處&#xff08;www.meyesemi.com) 1. 簡介 本案例旨在 ARM端運行 Linux系統&#xff0c;基通過 FSPI測試。 2. ARM端和 FPGA端通信流程 (1)ARM端實現SP…

github如何創建一個自己的倉庫保姆級教程

文章目錄 準備階段(github官網)添加ssh公鑰添加token創建倉庫 本地設置本地代理創建倉庫添加文件到倉庫進行提交 準備階段(github官網) 添加ssh公鑰 創建SSH KEY。先看一下你C盤用戶目錄下有沒有.ssh目錄&#xff0c;有的話看下里面有沒有id_rsa和id_rsa.pub這兩個文件&#…

LabVIEW 網絡流通信功能

LabVIEW 的網絡流技術實現主機 VI&#xff08;Host VI&#xff09;與客戶端 VI&#xff08;ClientVI&#xff09;間的雙向數據交互&#xff0c;包含命令發送與波形數據傳輸&#xff0c;支持跨設備、跨進程的實時通信&#xff0c;滿足分布式系統中數據交互與控制需求。 主機 VI邏…

Prompt 精通之路(一)- AI 時代的新語言:到底什么是 Prompt?為什么它如此重要?

AI 時代的新語言&#xff1a;到底什么是 Prompt&#xff1f;為什么它如此重要&#xff1f; 標簽&#xff1a; #Prompt新手指南 #提示詞入門 #AI指令 #人工智能 #ChatGPT &#x1f680; Prompt 精通之路&#xff1a;系列文章導航 第一篇&#xff1a;AI 時代的新語言&#xff1a…

uniapp 滾動tab

uniapp woui unibest <route lang"json5">{style: {navigationBarTitleText: 知識產權,navigationBarBackgroundColor: #C80F06,navigationBarTextStyle: white,backgroundColorTop: #C80F06,},} </route> <template><view class"bgc-b …

日事清駕駛艙模式上線:實時數據更新+項目管理+數據可視化,提升決策效率?

大家好&#xff01;我們在日事清最新更新中推出了一個令人激動的新功能——駕駛艙模式。這一全新界面將為企業管理者和團隊提供一個全面、實時的數據展示平臺。下面&#xff0c;讓我們詳細了解這個功能如何幫助您更好地把握企業動態和提升決策效率。 快速入口&#xff1a;一鍵激…

【Maven】Maven深度避坑指南:依賴沖突全維度解決方案與工業級實戰(超萬字解析)

注&#xff1a;本文基于50大型企業級項目經驗&#xff0c;結合Maven底層源碼機制&#xff0c;系統化解決依賴沖突問題。包含20個實戰場景、10類特殊案例及5大防御體系構建方案。 Maven深度避坑指南&#xff1a;依賴沖突全維度解決方案與工業級實戰&#xff08;超萬字解析&#…

Rust Web 全棧開發(二):構建 HTTP Server

Rust Web 全棧開發&#xff08;二&#xff09;&#xff1a;構建 HTTP Server Rust Web 全棧開發&#xff08;二&#xff09;&#xff1a;構建 HTTP Server創建成員包/庫&#xff1a;httpserver、http解析 HTTP 請求HTTP 請求的構成構建 HttpRequest 構建 HTTP 響應HTTP 響應的構…

小架構step系列01:小架構初衷

1 概述 小公司做業務服務&#xff0c;需要聚焦到實際的業務上&#xff0c;盡快通過業務服務客戶&#xff0c;給客戶創建價值&#xff0c;公司才能生存下去。在技術上采用的Web應用架構具備以下特點&#xff1a; 主要由開源組件組裝而成。這樣既可以節省成本&#xff0c;也可以把…

蘋果AR/VR頭顯路線圖曝光,微美全息推進AI/AR智能眼鏡新品開啟視覺體驗篇章

日前&#xff0c;郭明錤發表了一篇關于蘋果&#xff08;AAPL.US&#xff09;2025-2028頭戴式產品路線圖的文章&#xff0c;里面提到蘋果正在開發涵蓋MR頭顯、AI眼鏡、AR眼鏡、Birdbath眼鏡等共計7款設備。 蘋果的頭顯設備中&#xff0c;大量出貨的產品是類似于Ray-Ban Meta的智…

python pyecharts 數據分析及可視化(2)

一、任務要求 任務二&#xff1a;感冒高發期分析 【任務說明】 感冒是一種常見的急性上呼吸道病毒性感染性疾病&#xff0c;多由鼻病 毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯薩奇病毒、冠狀病 毒、腺病毒等引起。臨床表現為鼻塞、噴嚏、流涕、發熱、咳嗽、頭 痛等&#…

React自學 基礎一

React基礎 React 是一個由 Facebook&#xff08;現 Meta&#xff09;開發并維護的、開源的 JavaScript 庫&#xff0c;主要用于 構建用戶界面&#xff08;UI&#xff09;&#xff0c;尤其是單頁面應用程序中的動態、交互式界面。 簡單示例&#xff1a; import React, { useSt…

PHP語法基礎篇(八):超全局變量

超全局變量是在 PHP 4.1.0 中引入的&#xff0c;并且是內置變量&#xff0c;可以在所有作用域中始終可用。 PHP 中的許多預定義變量都是"超全局的"&#xff0c;這意味著它們在一個腳本的全部作用域中都可用。在函數或方法中無需執行 global $variable; 就可以訪問它們…

NumPy-核心函數concatenate()深度解析

NumPy-核心函數concatenate深度解析 一、concatenate()基礎語法與核心參數函數簽名與核心作用基礎特性&#xff1a;形狀匹配規則 二、多維數組拼接實戰示例1. 一維數組&#xff1a;最簡單的序列拼接2. 二維數組&#xff1a;按行與按列拼接對比按行拼接&#xff08;垂直方向&…

aws(學習筆記第四十八課) appsync-graphql-dynamodb

aws(學習筆記第四十八課) appsync-graphql-dynamodb 使用graphql來方便操作dynamodb 理解graphql中的graphql api&#xff0c;schema&#xff0c;resolver 學習內容&#xff1a; graphqlgraphql apischemaresolver 1. 代碼連接和修改 1.1 代碼鏈接 代碼鏈接&#xff08;app…

關于微前端框架micro,子應用設置--el-primary-color失效的問題

設置了manualChunks導致失效,去掉即可,比較小眾的問題 下面是deepseek的分析 關于 manualChunks 導致 Element Plus 主題變量失效的問題 你找到的確實是問題的關鍵所在。這個 manualChunks 配置影響了 Element Plus 樣式和變量的加載順序&#xff0c;從而導致主題變量失效。…

MySQL 學習 之 你還在用 TIMESTAMP 嗎?

目錄 1. 弊端1.1. 取值范圍1.2. 時區依賴1.3. 隱式轉換 2. 區別3. 解決 1. 弊端 1.1. 取值范圍 TIMESTAMP 的取值范圍為 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC&#xff0c;超出范圍的數據會被強制歸零或觸發異常?。 具體表現為在基金債券等業務中&#xff0…

java中字節和字符有何區別,為什么有字節流和字符流?

在Java中&#xff0c;字節&#xff08;byte&#xff09;和字符&#xff08;char&#xff09;是兩種不同的數據類型&#xff0c;它們的主要區別在于所表示的數據單位、用途以及編碼方式,字節流和字符流的區分就是為了解決編碼問題。 字節&#xff08;byte&#xff09;&#xff…