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