2013-06-12 164 views
2

我想使用solr的正則表達式功能來查詢日期字段。 我試圖做一個簡單的查詢,如下所示,但我得到0個結果,沒有錯誤。 ? ... Q = DATE:/ 200 [0-9] -03-30T11 \ 58 \:40Z/& FL = DATESolr日期正則表達式查詢

下面是一些樣本輸出:

<response> 
<lst name="responseHeader"> 
<int name="status">0</int> 
<int name="QTime">0</int> 
<lst name="params"> 
<str name="fl">id,date</str> 
<str name="q">date:/.*:.*/</str> 
</lst> 
</lst> 
<result name="response" numFound="39" start="0"> 
<doc> 
<str name="id">1362932537549-A17C9685</str> 
<date name="date">2012-10-31T14:57:53Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-AD280D59</str> 
<date name="date">2012-10-25T09:57:53Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-B091BE97</str> 
<date name="date">2012-10-23T09:57:53Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-B0D8341C</str> 
<date name="date">2012-10-22T14:57:53Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-40083ADB</str> 
<date name="date">2010-08-12T14:33:00Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-9CA68015</str> 
<date name="date">2011-07-20T12:25:02Z</date> 
</doc> 
... 

<response> 
<lst name="responseHeader"> 
<int name="status">0</int> 
<int name="QTime">8380</int> 
<lst name="params"> 
<str name="fl">id,date</str> 
<str name="q">date:/.*.*/</str> 
</lst> 
</lst> 
<result name="response" numFound="1263" start="0"> 
<doc> 
<str name="id">1362932537549-5A0DAFB7</str> 
<date name="date">2010-08-12T14:31:00Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-D712F1C71</str> 
<date name="date">2011-12-01T13:23:53Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-3FAA6BC</str> 
<date name="date">2012-05-25T14:26:08Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-C8A6B81F</str> 
<date name="date">2010-08-12T14:25:00Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-D712F1C8</str> 
<date name="date">2011-12-01T13:23:53Z</date> 
</doc> 
... 

<response> 
<lst name="responseHeader"> 
<int name="status">0</int> 
<int name="QTime">34443</int> 
<lst name="params"> 
<str name="fl">id,date</str> 
<str name="q">date:/.*0.*/</str> 
</lst> 
</lst> 
<result name="response" numFound="65" start="0"> 
<doc> 
<str name="id">1362932537549-A4BC013G</str> 
<date name="date">2012-10-29T17:57:53Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-862F708G</str> 
<date name="date">2013-02-14T09:48:46Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-B8A38A74</str> 
<date name="date">2013-02-14T09:49:18Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-D4BA90CD</str> 
<date name="date">2007-10-09T21:53:34Z</date> 
</doc> 
<doc> 
<str name="id">1362932537549-3028513F</str> 
<date name="date">2011-06-24T20:30:22Z</date> 
</doc> 
+1

如果這有幫助,像...?q = text:/ message(。*)?/&fl = id這樣的東西,文本將工作並返回每個文檔,並將'text'字段設置爲消息。對於日期字段,當我嘗試以下時,我得到0個結果:...?q =日期:/ 2013-03-30T15 \:58 \:4(。*)?/&fl = id,日期 –

+1

開始於比較簡單的表達方式如'?q = date:/.*/& fl = date'。如果這不起作用,那麼'date'不是'string'類型,可以直接進行正則表達式化。 –

+1

^這是有效的。當我使用時,我找回所有記錄?q = date:/.*/& fl = date –

回答

1

你的正則表達式的外觀不錯,但,而不是逃避冒號,儘量URL編碼值:(從關於這個問題的評論已遷移)

?q=DATE%3A%2F200%5B0-9%5D-03-30T11%5C%3A58%5C%3A40Z%2F&fl=DATE 

看起來不可能將一個日期字段正則表達式,至少是直接的。

當你發現,即使下面的查詢date:/.*_.*/date:/.*,.*/date:/.*A.*/返回的結果,即使時間戳顯然有沒有這些字符。我認爲,這是怎麼回事是date不是string場,因此,當您查詢字符像:,你實際上發現發生有該字符之間編碼例如原始二進制)數據結果。 (用外行人的話來說,想象在記事本中打開二進制數據(如可執行文件)並搜索ASCII字符。)

這也解釋了爲什麼你會得到相同數量的結果20到30所有這些查詢:統計上來說,二進制(和其他編碼)數據中隨機ASCII字符的重新編碼應該返回大約相同的結果頻率。