2

我想使用 solr 的正则表达式功能来查询日期字段。我正在尝试进行如下所示的简单查询,但得到 0 个结果且没有错误。...?q=DATE:/200[0-9]-03-30T11\:58\:40Z/&fl=DATE

以下是一些示例输出:

<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>
4

1 回答 1

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 字符应该返回大约相同频率的结果。

于 2013-06-12T01:15:32.163 回答