search(5)- elastic4s-構建索引

来源:https://www.cnblogs.com/tiger-xc/archive/2020/04/18/12727824.html
-Advertisement-
Play Games

按照計劃,這篇開始嘗試用elastic4s來做一系列索引管理和搜索操作示範。前面提過,elastic4s的主要功能之一是通過組合Dsl語句形成json請求。那麼我們先試試組合一些Dsl語句,再想辦法產生出json請求文本,然後在kibana控制臺中驗證它的正確性。 首先看看elastic4s提供的一 ...


  按照計劃,這篇開始嘗試用elastic4s來做一系列索引管理和搜索操作示範。前面提過,elastic4s的主要功能之一是通過組合Dsl語句形成json請求。那麼我們先試試組合一些Dsl語句,再想辦法產生出json請求文本,然後在kibana控制臺中驗證它的正確性。

首先看看elastic4s提供的一個show函數:

    def show(implicit handler: Handler[T, _]): String = Show[ElasticRequest].show(handler.build(t))

又見到了這個Handler[T, _],作為show的一個隱式參數。前面說過這個Handler[T, _]是個代表構建T類型json請求的typeclass。具體構建函數就是上面的這個build(t)函數。我們先看看CreateIndexRequest類型的show函數示範:

  val jsCreate = createIndex("company")
    .shards(1).replicas(1).show
  println(jsCreate)

產生了json如下:

PUT:/company?
StringEntity({"settings":{"index":{"number_of_shards":1,"number_of_replicas":1}}},Some(application/json))

在kibana里是如下表達的:

PUT /company
{
  "settings":{
    "index":{
      "number_of_shards":1,
      "number_of_replicas":1
    }
  }
}

可能是歷史原因吧,elastic4s與ES7.6還有很多不相容的地方,或者說是elastic4s還有許多沒來得及更新的地方。具體有問題的語句或參數都可以通過把json body放在kibana里進行驗證,如果elastic4s還有地方沒有完成覆蓋ES7.6功能的話,我們可以把一個正確的ES7.6 json腳本直接通過source傳人到操作類型中去:

  val js =
    """
      |{
      |  "settings":{
      |    "index":{
      |      "number_of_shards":1,
      |      "number_of_replicas":1
      |    }
      |  }
      |}
      |""".stripMargin
  val createFromJs = (createIndex("company").source(js)).show
  println(createFromJs)

下麵的例子是一套完整的索引創建過程:先刪除同名稱索引、創建索引、構建mapping:

import com.sksamuel.elastic4s.ElasticClient
import com.sksamuel.elastic4s.akka._
import akka.actor._
import com.sksamuel.elastic4s.requests.mappings.{KeywordField, MappingDefinition, NestedField, SearchAsYouTypeField}
import scala.concurrent.ExecutionContext.Implicits.global

object Lesson03 extends App {

  import com.sksamuel.elastic4s.ElasticDsl._
  //akka客戶端
  private implicit lazy val system: ActorSystem = ActorSystem()
  val akkaClient = AkkaHttpClient(AkkaHttpClientSettings(List("localhost:9200")))
  val client = ElasticClient(akkaClient)
  //刪除索引
  val idxDelete = client.execute(deleteIndex("company")).await
  //構建索引
  val idxCreate = client.execute(createIndex("company")
    .shards(1).replicas(1)).await
  //創建表結構
  if(idxCreate.isSuccess) {
    val compMapping = client.execute(
      putMapping("company").fields(
        KeywordField("code"),
        SearchAsYouTypeField("name")
          .fielddata(true)
          .fields(KeywordField("keyword")),
        textField("biztype"),
        NestedField("addr").fields(
          textField("district"),
          textField("address"),
          KeywordField("zipcode")
        ),
        dateField("regdate")
          .ignoreMalformed(true)
          .format("strict_date_optional_time||epoch_millis"),
        textField("contact")
      )).await
    if(compMapping.isSuccess)
      println(s"mapping successfully created.")
    else
      println(s"mapping creation error: ${compMapping.error.reason}")
  } else {
    println(s"index creation error: ${idxCreate.error.reason}")
  }

  system.terminate()
  client.close()
}

以上代碼有幾個地方值得提一下:

1、這上面使用了一個基於akka-stream的客戶端。優點是響應式標準相容,用隊列queue來緩衝密集請求

2、在刪除索引前為甚麼不先檢查一下同名索引是否存在?elastic4s ExistApi還是ES7以前版本,不能用

3、client.execute(...)返回Future, 為什麼不用for-yield?試過了,一是deleteIndex,createIndex返回結果與實際刪除、構建操作可能有些延遲,createIndex會返回索引已經存在錯誤, mapping會出現索引不存在錯誤。

 


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

-Advertisement-
Play Games
更多相關文章
  • 通過本次講座,我想強調的是,You!Leaders!一定要通過層層疊加的“Rules”建立起本能反應,一遇到類似的事情,應激般的就知道該怎麼設計,怎麼行動,怎麼救火。 而這些“Rules”是經歷了血與火的洗禮鑄造的,每一條都有來由有去路。 等有一天你依據本能(也就是你自建的法則)行事的時候,你就會體... ...
  • 更多精彩文章請關註公眾號『大海的BLOG』 問題 話說大詩人李白,一生好飲。幸好他從不開車。 一天,他提著酒壺,從家裡出來,酒壺中有酒兩鬥。他邊走邊唱: 無事街上走,提壺去打酒。 逢店加一倍,遇花喝一鬥。 這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了。請 ...
  • 本系列文章為《編寫高質量代碼——改善Python程式的91個建議》的精華彙總。 首發於公眾號【Python與演算法之路】 關於導入模塊 Python的3種引入外部模塊的方式: 語句、 和 函數。其中前兩種比較常見。 在使用 時,應註意: 優先使用 或 有節制的使用 儘量避免使用 對於 ,如果無節制的使 ...
  • 本系列文章為《編寫高質量代碼——改善Python程式的91個建議》的精煉彙總。 利用assert語句發現問題 assert語句的基本語法如下: 其中, 是判斷語句,會返回True或False,當返回False時會引發AssertionError。 中的內容表示是可選的,用來傳遞具體的異常信息。 利用 ...
  • 1. 應用K-means演算法進行圖片壓縮 讀取一張圖片 觀察圖片文件大小,占記憶體大小,圖片數據結構,線性化 用kmeans對圖片像素顏色進行聚類 獲取每個像素的顏色類別,每個類別的顏色 壓縮圖片生成:以聚類中收替代原像素顏色,還原為二維 觀察壓縮圖片的文件大小,占記憶體大小 from sklearn. ...
  • REST:即 Representational State Transfer。(資源)表現層狀態轉化 。是目前最流行的一種互聯網軟體架構。它結構清晰、符合標準、易於理解、擴展方便, 所以正得到越來越多網站的採用。使用 REST 風格的請求方式,可以簡化 url,達到使用同一個 url 不同請求方式來 ...
  • HTTP 405 的錯誤提示:消息 JSP 只允許 GET、POST 或 HEAD。Jasper 還允許 OPTIONS 的解決方法 ...
  • A - Balloons 題意:本題的題意比較簡單,簡單說就是分數字,使得A得到的數字之和大於B得到的數字之和,然後輸出分給A的數字的下標。 題解:要註意特判n==1和n==2的情況,屬於簽到題。 代碼: #include<iostream> #include<algorithm> #include ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...