NEST 中的日期數學表達式

来源:https://www.cnblogs.com/WessonStar/archive/2018/01/19/8317731.html
-Advertisement-
Play Games

Date math expressions Version: 5.x 英文原文地址: "Date math expressions" query/filter 中涉及到日期類型時(如: 參數),Elasticsearch 允許我們使用日期數學表達式。 表達式由一個 "anchor" (錨點)日期開頭 ...


Date math expressions

Version: 5.x

英文原文地址:Date math expressions

query/filter 中涉及到日期類型時(如:timeout 參數),Elasticsearch 允許我們使用日期數學表達式。

表達式由一個 "anchor" (錨點)日期開頭,這個錨點可以是 now 或者其他可用的以 || 結尾的日期格式字元串。錨點之後可以跟著一個數學表達式,支持 + , -/ (舍入取整)。可用的單位有:

  • y (year) 年
  • M (month) 月
  • w (week) 周
  • d (day) 日
  • h (hour) 時
  • m (minute) 分
  • s (second) 秒

單純的一個整數表示以毫秒為單位的時間,2d 表示 2 天。

更多信息請參閱 Elasticsearch 官方文檔中關於 Date Math 的說明。

說明:”錨點||數學表達式“ 所描述的其實就是一個參考日期 + 一個偏移時間。舉個慄子:2018-01-01||+1d 表達的是 2018年1月2日

Simple expressions

你可以使用 DateMath 的靜態方法創建一個簡單的表達式

Expect("now").WhenSerializing(Nest.DateMath.Now);
Expect("2015-05-05T00:00:00").WhenSerializing(Nest.DateMath.Anchored(new DateTime(2015,05, 05)));

字元串會隱式轉換成 DateMath

Expect("now").WhenSerializing<Nest.DateMath>("now");

但是不會智能過濾錯誤的數學表達式

var nonsense = "now||*asdaqwe";

上面這個字元串轉換成 DateMath 後會被當作一個錨點日期(沒有數學表達式)

Expect(nonsense).WhenSerializing<Nest.DateMath>(nonsense)
    .Result(dateMath => ((IDateMath)dateMath)
        .Anchor.Match(
            d => d.Should().NotBe(default(DateTime)),
            s => s.Should().Be(nonsense)
        )
    );

DateTime 也可以隱式轉換成簡單的日期數學表達式;生成的錨點是一個實際的 DateTime ,即使經過了往返過程中的序列化/反序列化

var date = new DateTime(2015, 05, 05);
Expect("2015-05-05T00:00:00").WhenSerializing<Nest.DateMath>(date)
    .Result(dateMath => ((IDateMath)dateMath)
        .Anchor.Match(
            d => d.Should().Be(date),
            s => s.Should().BeNull()
        )
    );

Complex expressions

可以將範圍鏈接到簡單表達式後面

Expect("now+1d").WhenSerializing(Nest.DateMath.Now.Add("1d"));

可以鏈接多種操作

Expect("now+1d-1m").WhenSerializing(
    Nest.DateMath.Now.Add("1d").Subtract(TimeSpan.FromMinutes(1)));

舍入值可以鏈接到表達式的末尾,在此之後不能追加其他範圍

Expect("now+1d-1m/d").WhenSerializing(
    Nest.DateMath.Now.Add("1d")
        .Subtract(TimeSpan.FromMinutes(1))
        .RoundTo(Nest.TimeUnit.Day));

當設置一個錨點日期(參照日期),需要在定位點和範圍之間插入一個分割符 || (自動地)。同樣的,後面可以追加多個範圍

Expect("2015-05-05T00:00:00||+1d-1m").WhenSerializing(
    Nest.DateMath.Anchored(new DateTime(2015,05,05))
        .Add("1d")
        .Subtract(TimeSpan.FromMinutes(1)));

Fractional times

DateMath 表達式不支持小數,所以會選擇一個可以將表達式轉換成整數的最大的單位

Expect("now+25h")
    .WhenSerializing(Nest.DateMath.Now.Add(TimeSpan.FromHours(25)))
    .WhenSerializing(Nest.DateMath.Now.Add(90000000))
    .WhenSerializing(Nest.DateMath.Now.Add(new Time(25, Nest.TimeUnit.Hour)))
    .WhenSerializing(Nest.DateMath.Now.Add("25h"));

Expect("now+90001s").WhenSerializing(
    Nest.DateMath.Now.Add(TimeSpan.FromHours(25).Add(TimeSpan.FromSeconds(1))));

Expect("now+90000001ms").WhenSerializing(
    Nest.DateMath.Now.Add(TimeSpan.FromHours(25).Add(TimeSpan.FromMilliseconds(1))));

Expect("now+1y")
    .WhenSerializing(Nest.DateMath.Now.Add("1y"))
    .WhenSerializing(Nest.DateMath.Now.Add(new Time(1, Nest.TimeUnit.Year)));

Expect("now+6M")
    .WhenSerializing(Nest.DateMath.Now.Add("6M"))
    .WhenSerializing(Nest.DateMath.Now.Add("0.5y"))
    .WhenSerializing(Nest.DateMath.Now.Add(new Time(0.5, Nest.TimeUnit.Year)))
    .WhenSerializing(Nest.DateMath.Now.Add(new Time(6, Nest.TimeUnit.Month)));

Expect("now+364d")
    .WhenSerializing(Nest.DateMath.Now.Add(TimeSpan.FromDays(7 * 52)));

Expect("now+52w")
    .WhenSerializing(Nest.DateMath.Now.Add(new Time("52w")))
    .WhenSerializing(Nest.DateMath.Now.Add(new Time(52, Nest.TimeUnit.Week)));

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

-Advertisement-
Play Games
更多相關文章
  • 1. 安裝mysql-python 運行下麵的命令: 安裝以後: 如果沒有出錯,就表明安裝成功。 2. 連接MySQL 其中localhost是伺服器名,root是用戶名,1是密碼,fs是資料庫名稱,前提是MySQL資料庫設置了相應的用戶名和密碼。 連接成功以後,通過 獲取游標。 3. 查詢數據 c ...
  • ****************************************************************************************** excel表格導出,使用POI實現 ***************************************** ...
  • 一、簡介 MongoDB是一款強大、靈活、且易於擴展的通用型資料庫 1、易用性 2、易擴展性 3、豐富的功能 4、卓越的性能 二、MongoDB基礎 a、文檔是MongoDB的核心概念。文檔就是鍵值對的一個有序集{'msg':'hello','foo':3}。類似於python中的有序字典 b、集合 ...
  • 因為有基礎,我直接簡單寫了##定義類,創建對象,調用對象方法,返回值 ##添加屬性,和Java有區別 ##構造方法 python構造方法只有一個或者沒有,和Java不同 ###繼承 1 class Father: 2 def f(self): 3 print('father') 4 def smok ...
  • Beautifulsoup模塊 一 介紹 Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間.你可能在尋找 Beautiful So ...
  • 1. 修改Maven的Settings.xml文件添加如下內容 2. 在項目的pom.xml文件中添加: 3. 打開項目配置,設置Modules的Language Level為”8” 最後按”Ctrl+Alt+S”打開設置,搜索”Java Compiler”,將預設jdk和當前modual的jdk版 ...
  • 同步代碼塊的鎖也可以用對象,如LockA.locka locka對象為靜態 公共 ...
  • 如圖,我是用一個ListBox來排列的,但是怎麼讓它豎著排列呢 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...