W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Solr 的日期字段(DatePointField,DateRangeField 和已過時的 TrieDateField)代表“datas”,如時間精確到毫秒的點。使用的格式是XML Schema規(guī)范中 dateTime 的規(guī)范化表示形式的限制形式,這是 ISO-8601 的一個受限子集。對于那些熟悉 Java 8 的人來說,Solr 使用 DateTimeFormatter.ISO_INSTANT 進行格式化,并使用 “l(fā)eniency” 進行解析。
如以下示例:
YYYY-MM-DDThh:mm:ssZ
其中:
請注意,不能指定時區(qū)。日期的字符串表示形式始終以協(xié)調(diào)世界時 (UTC) 表示。這是一個示例值:
1972-05-20T17:33:18Z
如果您愿意,您可以選擇包含小數(shù)的秒數(shù),但任何超出毫秒的精度都將被忽略。下面是 sub-seconds 的示例值:
必須有一個領(lǐng)先的 "-" 符號在0000年前的日期,并且在9999年之后,Solr將會以一個領(lǐng)先的“+”來格式化日期。年0000被認為是公元前1年;沒有公元 0 年或公元前 0 年的表達方法。
可能需要查詢轉(zhuǎn)義:
如您所見,日期格式包括分隔小時、分鐘和秒的冒號字符。因為冒號是 Solr 最常見的查詢解析器的特殊字符,所以有時需要轉(zhuǎn)義,具體取決于您正在嘗試執(zhí)行的操作。
這通常是一個無效查詢:
datefield: 1972-05-20T17:33:18.772Z
以下這些是有效的查詢:
Solr 的 DateRangeField 支持上面描述的時間段語法中的相同點(具有下面描述的日期數(shù)學(xué))以及更多的表達日期范圍。一類示例是截斷的日期,它表示整個日期跨度到所指示的精度。另一個類使用范圍語法([ TO ])。下面是一些示例:
限制:范圍語法不支持嵌入日期數(shù)學(xué)。如果您指定了 DatePointField 支持的日期實例,并將日期數(shù)學(xué)截斷,比如 NOW/DAY,那么您仍然可以得到當(dāng)天的第一個毫秒,而不是整天的范圍。獨占范圍(使用{&})在查詢中工作,但不適用于索引范圍。
Solr 的日期字段類型也支持日期數(shù)學(xué)表達式,這使得相對于固定時刻的時間創(chuàng)建變得容易,包括使用“NOW”的特殊值來表示的當(dāng)前時間。
日期數(shù)學(xué)表達式包括在指定的單位中添加一定量的時間,或者以指定單位四舍五入當(dāng)前時間。表達式可以鏈接并從左向右進行評估。
例如:以下代表了兩個月后的時間點:
NOW+2MONTHS
這是一天前:
NOW-1DAY
斜線用于表示舍入。這代表當(dāng)前小時的開始:
NOW/HOUR
下面的例子計算(精確到毫秒)時間為六個月和三天后的時間點,然后將該時間點回溯到當(dāng)天的開始時間:
NOW+6MONTHS+3DAYS/DAY
請注意,雖然日期數(shù)學(xué)是相對于 NOW 是最常用的,但它也可以應(yīng)用于任何固定時間點:
1972-05-20T17:33:18.772Z+6MONTHS+3DAYS/DAY
該 NOW 參數(shù)由 Solr 在內(nèi)部使用,以確保在分布式請求中的多個節(jié)點上分析一致的日期數(shù)學(xué)表達式。但是可以指定 Solr 使用任意時刻(過去或?qū)恚┑娜我鈺r刻覆蓋“ NOW” 的特殊值會影響日期數(shù)學(xué)表達式的所有情況。
它必須被指定為自紀(jì)元以來的(長值)毫秒。
示例:
q=solr&fq=start_date:[* TO NOW]&NOW=1384387200000
默認情況下,所有日期數(shù)學(xué)表達式都是相對于 UTC TimeZone 計算的,但是 TZ 可以指定該參數(shù)來覆蓋此行為,方法是強制所有基于日期的加法和舍入相對于指定的時區(qū)。
例如,下面的請求將使用范圍面來面向當(dāng)前月份,“每天”相對 UTC:
http://localhost:8983/solr/my_collection/select?q=*:*&facet.range=my_date_field&facet=true&facet.range.start=NOW/MONTH&facet.range.end=NOW/MONTH%2B1MONTH&facet.range.gap=%2B1DAY
<int name="2013-11-01T00:00:00Z">0</int>
<int name="2013-11-02T00:00:00Z">0</int>
<int name="2013-11-03T00:00:00Z">0</int>
<int name="2013-11-04T00:00:00Z">0</int>
<int name="2013-11-05T00:00:00Z">0</int>
<int name="2013-11-06T00:00:00Z">0</int>
<int name="2013-11-07T00:00:00Z">0</int>
...
在本例中,“days” 將根據(jù)指定的時區(qū)進行計算 - 包括任何適用的夏令時間調(diào)整:
http://localhost:8983/solr/my_collection/select?q=*:*&facet.range=my_date_field&facet=true&facet.range.start=NOW/MONTH&facet.range.end=NOW/MONTH%2B1MONTH&facet.range.gap=%2B1DAY&TZ=America/Los_Angeles
<int name="2013-11-01T07:00:00Z">0</int>
<int name="2013-11-02T07:00:00Z">0</int>
<int name="2013-11-03T07:00:00Z">0</int>
<int name="2013-11-04T08:00:00Z">0</int>
<int name="2013-11-05T08:00:00Z">0</int>
<int name="2013-11-06T08:00:00Z">0</int>
<int name="2013-11-07T08:00:00Z">0</int>
...
DateRangeField 幾乎是 DatePointField 所用地方的替代品。唯一的區(qū)別是,Solr 的 XML 或 SolrJ 響應(yīng)格式將存儲的數(shù)據(jù)作為一個字符串而不是一個日期。該字段的基礎(chǔ)索引數(shù)據(jù)會稍大一些。與時間單位對齊的查詢應(yīng)該比 TrieDateField 快,尤其是在 UTC 的情況下。
DateRangeField,顧名思義,其主要觀點是允許索引日期范圍。要做到這一點,只需提供上面顯示的格式的字符串。它還支持在索引數(shù)據(jù)和查詢范圍之間指定3個不同的關(guān)系謂詞:
你可以通過查詢使用 oplocal-params 參數(shù)來指定謂詞,如下所示:
fq={!field f=dateRange op=Contains}[2013 TO 2018]
與大多數(shù)本地參數(shù)不同,op 實際上不是由任何查詢解析器(field)定義的,它是由字段類型定義的,在本例中為 DateRangeField。在上面的示例中,它將查找包含 (或等于) 范圍2013到2018的索引范圍的文檔。文檔中的多值重疊索引范圍有效地合并。
有關(guān) DateRangeField 示例用例,請參閱 Solr 的社區(qū) wiki。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: