ES_ChatGPT問答

来源:https://www.cnblogs.com/kakarotto-chen/archive/2023/04/10/17302851.html
-Advertisement-
Play Games

Q1:==springboot項目,如何使用elasticsearch的api增刪改查?查詢中有哪些方式,如果模糊查詢、排序查詢、分頁查詢?分別闡述下這些查詢方式的用法?最後舉一個完整的例子== 答: 在Spring Boot項目中使用Elasticsearch的API增刪改查,需要引入spring ...


Q1:springboot項目,如何使用elasticsearch的api增刪改查?查詢中有哪些方式,如果模糊查詢、排序查詢、分頁查詢?分別闡述下這些查詢方式的用法?最後舉一個完整的例子

答:

在Spring Boot項目中使用Elasticsearch的API增刪改查,需要引入spring-boot-starter-data-elasticsearch依賴。該依賴會給我們提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate進行增刪改查操作。

使用ElasticsearchRestTemplate進行查詢操作,我們可以通過NativeSearchQueryBuilder組裝查詢的條件。查詢可以使用如下幾種方式:

  1. Term查詢:用於匹配精確的值,不進行分詞
QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
  1. Match查詢:用於根據分詞查詢
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
  1. Bool查詢:用於多條件查詢
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
        .must(QueryBuilders.matchQuery("field1", "value1"))
        .must(QueryBuilders.matchQuery("field2", "value2"));

常見的查詢操作,包括模糊查詢、排序查詢、分頁查詢,我們可以通過在構建查詢條件時,分別加入相應的條件來實現。

  1. 模糊查詢

模糊查詢需要使用wildcardQueryfuzzyQuery。其中,wildcardQuery是基於通配符的模糊查詢,而fuzzyQuery則是基於編輯距離的模糊查詢。

QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "value*");
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "value");
  1. 排序查詢

排序查詢需要使用SortBuilder進行排序設置,排序欄位需要在mapping設置。

NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withSort(SortBuilders.fieldSort("field").order(SortOrder.ASC));
  1. 分頁查詢

分頁查詢需要使用PageRequest對分頁參數進行設置,然後傳遞給ElasticsearchRestTemplate進行查詢。

PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withPageable(pageRequest);

我們來看一個完整的示例,以模糊查詢、排序查詢、分頁查詢為例:

@Autowired
private ElasticsearchRestTemplate restTemplate;

public Page<Book> searchBooks(String keyword, int pageNumber, int pageSize) {

    // 構建查詢條件
    QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name", "*"+keyword+"*");
    
    NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
    // 使用查詢條件
    searchQueryBuilder.withQuery(queryBuilder);
    // 分頁
    PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
    searchQueryBuilder.withPageable(pageRequest);
    // 排序
    searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));

    NativeSearchQuery searchQuery = searchQueryBuilder.build();
    SearchHits<Book> searchHits = restTemplate.search(searchQuery, Book.class);
    return searchHits.map(SearchHit::getContent);
}

其中,定義了一個Book實體類,包含idnameprice三個屬性。searchBooks方法使用wildcardQuery實現模糊查詢,使用PageRequest實現分頁查詢,使用fieldSort實現排序查詢。最後使用ElasticsearchRestTemplate執行查詢,並返回查詢結果。

Q2:elasticsearch中儲存的複雜的數據機構是怎麼樣的,舉個複雜結構的例子?

答:

在Elasticsearch中Elasticsearch是基於Lucene的搜索引擎,支持嵌套的複雜結構。在Elasticsearch中,複雜數據結構以文檔(Document)的方式儲存,每個文檔都由多個欄位(Field)組成,每個欄位可以是基本數據類型,也可以是對象類型,內部嵌套的對象類型被稱為嵌套類型(Nested Type)。

下麵是一個複雜結構的文檔示例,它表示一個學生的信息,包括姓名、年齡、性別、所在學校、所在班級、選修的科目、成績等信息。

{
    "name": "小明",
    "age": 18,
    "gender": "male",
    "school": {
        "name": "清華大學",
        "address": "北京市海澱區",
        "country": "中國"
    },
    "class": {
        "name": "高三(1)班",
        "teachers": ["李老師", "張老師"],
        "students": [
            {
                "name": "小明",
                "age": 18,
                "gender": "male"
            },
            {
                "name": "小紅",
                "age": 17,
                "gender": "female"
            },
            {
                "name": "小剛",
                "age": 18,
                "gender": "male"
            }
        ]
    },
    "courses": [
        {
            "name": "語文",
            "teacher": "張老師",
            "score": 90
        },
        {
            "name": "數學",
            "teacher": "李老師",
            "score": 85
        },
        {
            "name": "英語",
            "teacher": "王老師",
            "score": 92
        }
    ]
}

可以看到,該文檔中有嵌套的對象類型,包括schoolclassclass中又包括了一個嵌套的對象類型students,以及一個嵌套的簡單數據類型teacherscourses是一個數組類型,包括多個嵌套的對象類型。

在Elasticsearch中,可以通過Mapping來指定文檔中的欄位類型和屬性。對於嵌套類型,需要額外指定nested屬性,才能支持嵌套查詢。

{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "gender": {
        "type": "keyword"
      },
      "school": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "address": {
            "type": "text"
          },
          "country": {
            "type": "keyword"
          }
        }
      },
      "class": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "teachers": {
            "type": "keyword"
          },
          "students": {
            "type": "nested",
            "properties": {
              "name": {
                "type": "text"
              },
              "age": {
                "type": "integer"
              },
              "gender": {
                "type": "keyword"
              }
            }
          }
        }
      },
      "courses": {
        "type": "nested",
        "properties": {
          "name": {
            "type": "text"
          },
          "teacher": {
            "type": "keyword"
          },
          "score": {
            "type": "integer"
          }
        }
      }
    }
  }
}

通過這樣的Mapping,就能在Elasticsearch中儲存並查詢複雜的嵌套結構數據。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 哈嘍大家好,我是鹹魚。今天跟大家分享一個關於 Linux 服務(service)相關的案例 案例現象 我在 3 月 31日的時候發表了一篇《shell 腳本之一鍵部署安裝 Nginx》,介紹瞭如何通過 shell 腳本一鍵安裝 Nginx 我腳本中執行了 Nginx 開機自啟動的命令,當我使用 sy ...
  • 600 條最強 Linux 命令總結 每博一文案 你有千萬條微博想寫,可有些根本不重要,後來你才懂那是你怕別人看穿你所以才把真話埋在日常里。你有千萬句話想說,可點開那 個對話框,你根本打不出一個字。你才明白,原來你從一開始就怕別人看穿,所以寧可孤獨。所以你寧可每天嘻嘻哈哈,也不要被人看出來你真的難受 ...
  • 介紹了使用海思 CPU 的機頂盒的固件備份和燒錄。通過 USB-TTL 串口燒錄器 CH340 連接機頂盒,使用華為海思刷機工具 HiTool 創建和修改分區表文件,備份和燒寫固件,通過升級包升級系統。在海納思系統中安裝homeassistant,通過 FTP、WebDAV、Alist雲盤訪問文件,... ...
  • 鎖屏面試題百日百刷,每個工作日堅持更新面試題。請看到最後就能獲取你想要的,接下來的是今日的面試題: 1.解釋一下布隆過濾器原理 在日常生活中,包括在設計電腦軟體時,我們經常要判斷一個元素是否在一個集合中。比如在字處理軟體中,需要檢查一個英語單詞是否拼寫正確(也就是要判斷它是否在已知的字典中);在 ...
  • 函數介紹:substring() 函數用於截取字元串,可從字元串的某一位置開始,向右截取若幹個字元,返回一個特定長度的字元串 功能:返回字元、二進位、文本或圖像表達式的一部分 語法:SUBSTRING ( expression, start, length ) SQL 中的 substring 函數 ...
  • 摘要:Redis事務包含兩種模式:事務模式和Lua腳本。 本文分享自華為雲社區《一文講透 Redis 事務》,作者: 勇哥java實戰分享。 準確的講,Redis事務包含兩種模式:事務模式和Lua腳本。 先說結論: Redis的事務模式具備如下特點: 保證隔離性; 無法保證持久性; 具備了一定的原子 ...
  • pg Extended Query PostgreSQL: Documentation: 15: 55.2. Message Flow 多個階段,可復用 Parse → DESCRIBE statement → SYNC Parse 解析, 將 sql 文本字元串,解析成 named prepare ...
  • 摘要:相比於傳統的微服務架構,雲原生和 serverless 技術更加靈活、高效,能夠更好地滿足用戶的需求。 本文分享自華為雲社區《《鳳凰架構》學習和思考——雲原生時代的服務架構演進史》,作者:breakDawn。 隨著雲原生的概念越來越火,服務的架構應該如何發展和演進,成為很多程式員關心的話題。大 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...