市長信箱郵件查詢服務: 使用Elasticsearch 替代 Mysql

来源:http://www.cnblogs.com/ybak/archive/2016/05/25/5528482.html
-Advertisement-
Play Games

市長信箱郵件查詢服務: 使用Elasticsearch 替代 Mysql 我在上一篇文章中實現了一個基於Springboot構建的web應用: 市長信箱郵件查詢服務. 應用將郵件信息抓取後保存在Mysql中,用以提供給搜索Web使用.Mysql雖然集成簡單,能快速實現功能, 但like查詢性能一般, ...


市長信箱郵件查詢服務: 使用Elasticsearch 替代 Mysql

我在上一篇文章中實現了一個基於Springboot構建的web應用: 市長信箱郵件查詢服務. 應用將郵件信息抓取後保存在Mysql中,用以提供給搜索Web使用.Mysql雖然集成簡單,能快速實現功能, 但like查詢性能一般, 尤其數據量大了之後就必須考慮使用搜索引擎. 所以這次我把存儲從Mysql替換為Elasticsearch(ES).


Elasticsearch提供了兩種方式API來進行調用: Rest API與Java Native. Java Native的執行效率更高, 並且與當前項目集成更方便,所以我這裡選擇了Java native Api. 引入Java native Api,只需要在根pom.xml添加依賴:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.3.3</version>
</dependency>

使用ES替換Mysql,需要考慮這兩方面:

  1. 存儲: 將Mysql的insert插入數據改為ES的添加文檔操作.
  2. 查詢: 替換Mysql的查詢sql語句,改為ES的搜索操作.

存儲:

由於我們的郵件結構簡單,沒有內嵌其他複雜對象, 所以從mysql轉換為ES的文檔非常自然. 只需調用ES的添加文檔API即可:

public static void indexMails(Iterable<Mail> mails) {
    BulkRequestBuilder bulkRequest = client.prepareBulk();
    for (Mail mail : mails) {
        addMailIndexRequest(bulkRequest, mail);
    }
    BulkResponse bulkResponse = bulkRequest.get();
    System.out.println(JSON.toJSONString(bulkResponse));
}

private static void addMailIndexRequest(BulkRequestBuilder bulkRequest, Mail mail) {
    try {
        bulkRequest.add(client.prepareIndex("chengdu12345", "mail")
            .setSource(XContentFactory.jsonBuilder()
                .startObject()
                .field("content", mail.content)
                .field("createDate", mail.createDate)
                .field("acceptUnit", mail.acceptUnit)
                .field("category", mail.category)
                .field("result", mail.result)
                .field("sender", mail.sender)
                .field("status", mail.status)
                .field("title", mail.title)
                .field("url", mail.url)
                .field("views", mail.views)
                .endObject())
        );
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

在以上代碼中,我使用了批量添加(bulkRequest)API, 以減少API調用次數.

查詢:

之前Mysql中郵件的查詢sql如下:

select m from cheng12345 m where m.title like ? or m.content like ? or m.result like ? order by create_date desc limit ?,?

用ES來實現SQL對應效果的代碼也非常簡單:

public static SearchHits searchByKeyword(String keyword, int from, int size) {
    SearchRequestBuilder request = client.prepareSearch("chengdu12345")
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .setQuery(QueryBuilders.multiMatchQuery(keyword, "title", "content", "result")
            .type(MatchQueryBuilder.Type.PHRASE))//完全匹配
            .addSort("createDate", SortOrder.DESC)
            .setFrom(from).setSize(size).setExplain(true);

    SearchResponse response = request.execute().actionGet();
    return response.getHits();
}

這裡需要註意的是,查詢類型我選擇的是短語查詢(Type.PHRASE), 它能保證搜索時輸入的短語不被拆分, 否則我輸入"紅牌樓"查詢時,可能返回一堆包含"紅樓"的郵件列表, 這明顯不是我想要的結果.

另外, Springdata同樣提供了對ES的支持, 它像對JPA一樣提供了基於Repository模板方法支持,利用它能簡化不少對ES操作的代碼.


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

-Advertisement-
Play Games
更多相關文章
  • Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2]. Note: Each element i ...
  • 嚴格來講是給在OSC上貢獻過內容的OSC用戶刷積分。 OSC很多操作都需要消耗積分,很多人給OSC貢獻了內容, 但是卻沒有人點贊,所以有些人在OSC混了很多年也沒有積分。 本文中使用到的工具有gifcam 、fiddler 、Wireshark。gifcam 是一個小巧的GIF錄屏軟體,可以把你電腦 ...
  • consul的具體安裝與操作查看博客的consul系列。 一、啟動consul (1個server+1個client,方便起見,client使用本機):查看:http://www.cnblogs.com/java-zhao/p/5375132.html 1、開啟虛擬機-->切換到vagrantFil ...
  • 文件上傳: 1、JSP中提交method="post" enctype="multipart/form-data" 的表單 2、Action中接收file,fileFileName, fileContentType文件參數 3、 savedFile = new File("E:\\File", fi ...
  • 正式啟動項目後的第一周 這一周有三天是在研討會中進行的,各種需求討論。。。至少 最終版還是確定了,不會再改核心 1、搭建基本項目框架 maven聚合工程 - 後臺管理系統,restful介面服務(待更新:訂單服務,RMQ服務,SSO單點登錄) 2、安裝mysql 遇到的問題:遠程不能訪問,人之常情, ...
  • 開發一個項目,參數是必不可少的,規模越大參數越多。在不同的測試環境中部署,或者是依賴項目的信息發生了變化,你有沒有想跳樓的感覺?如果有,恭喜你,你至少已經不是在開發玩具系統了。 本文試圖列舉一些配置參數的方法,希望對你的項目有所幫助。 一、可用性模式-外部配置 引用自圖書《Java應用架構設計:模塊 ...
  • 一、String類String類在java.lang包中,java使用String類創建一個字元串變數,字元串變數屬於對象。java把String類聲明的final類,不能有類。String類對象創建後不能修改,由0或多個字元組成,包含在一對雙引號之間。二、String類對象的創建字元串聲明:Str ...
  • 單例模式最初的定義出現於《設計模式》(艾迪生維斯理, 1994):“保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。” 特點:一是某個類只能有一個實例; 二是它必須自行創建這個實例; 三是它必須自行向整個系統提供這個實例。 一、經典實現 二、靜態構造函數實現 三、靜態變數實現 測試: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...