当前位置: 首页 > 知识库问答 >
问题:

Solr索引的日期字段上的Lucene查询

钦良弼
2023-03-14

我们在各种搜索应用程序中使用solr索引。在大多数情况下,我们使用它就像您使用管理界面一样。例如:

+text:Mr +text:burns +publish_date[2012-09-10T00:00:00Z TO 2012-10-10T00:00:00Z]

这个很好用
我的问题是,在一个应用程序中,我们直接对索引使用复杂的lucene查询(不使用solr),在这些查询中,我找不到如何搜索日期字段
在模式中。xml:

<field name="publish_date" type="date" indexed="true" stored="true"/>

看起来solr将日期存储为以毫秒为单位的unix时间,当从索引中提取字段时,它看起来1336867200000

在Lucene中,我尝试了我能想到的所有查询:

TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800000", "1336867200000", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800", "1336867200", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "2012-09-10T00:00:00Z", "2012-10-10T00:00:00Z", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "20120910", "20121010", true, true);
NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800, 1336867200, true, true);

还有其他一些尝试
唯一返回结果的查询是

TermRangeQuery nq1 = new TermRangeQuery("publish_date",  null, null, true, true);

当然,这是一个带有“开放endpoint”的查询,但它似乎确实适用于该字段被索引为字符串(同样的方法不适用于int范围或远程范围)。
令人沮丧的是,这显然是可能的,我只需要弄清楚solr是如何预制它的日期范围的。
有人知道如何执行此搜索吗?
任何帮助都将不胜感激。

共有1个答案

谢翰学
2023-03-14

“1336867200”是一个时间戳,是的。

TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800000", "1336867200000", true, true);
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "1299628800", "1336867200", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "2012-09-10T00:00:00Z", "2012-10-10T00:00:00Z", true, true); 
TermRangeQuery nq1 = new TermRangeQuery("publish_date",  "20120910", "20121010", true, true);

以上这些方法不起作用,因为您正在对数字数据使用字符串参数。

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800, 1336867200, true, true);

这个不起作用,因为你没有用足够的零填充它。1299628800代表Fri Jan16 02:00:28GMT 1970。

如果您有日期在2011年3月9日至2012年5月13日之间的文件,以下内容应适用:

NumericRangeQuery nq1 = NumericRangeQuery.newLongRange("publish_date", 1299628800000L, 1336867200000L, true, true);
 类似资料:
  • 我已经通过了lucene索引机制。我有一些疑问,我找不到一个直截了当的答案,我仍然对我在几篇参考文献中的阅读感到困惑。 考虑使用Lucene对数据库表进行索引。 假设该表有10列,其中很少有caseid、modifiedby、modifiedtime、casename、legalname等。。。 现在,如果我创建一个索引的情况下,那么在搜索是不是可以搜索的基础上修改字段??? 假设我在2列case

  • 问题内容: 我在MySQL表中有两个表字段。一个是VARCHAR,是分类广告(分类网站)的“标题”。另一个是TEXT字段,其中包含用于分类的“文本”。 两个问题: 如何确定如何索引这两个字段? (什么字段类型,要使用什么类,等等) 目前,我有一个“ ad_id”作为每个广告的唯一标识符,例如“ bmw_m3_82398292”。 每当SOLR找到“查询匹配”时,如何使SOLR返回此标识符? (标识

  • 我将向你展示我的弹性配置,以及我是如何在Lucene上复制它的。 这是我创建索引的弹性搜索连接器: 以下是我的疑问:

  • 嗨,我想做一个查询,以打印用户在ORACLE上的特定月份做一个动作SQL开发者。 以下是表格: 以下是SACA的价值观: 这就是查询。我想从FECHA\u DEV(代码)栏查询获得特定月份(05)书籍的用户。以下是查询: 查询为空,但如果更改了值,并从第一个和最后一个位置进行询问,则会正常工作。 那么,日期格式的月份索引是什么?

  • 我有一个lucene查询,可以对索引字段进行全文搜索。我想将日期范围添加到此查询。 我找到了这个问题并在那里使用了答案:如何在日期之间搜索(Hibernate搜索)? 但当我想在两个日期之间获取数据时,它什么也不返回。我使用的是MSSQL数据库,日期字段的类型是datetime。但它在实体类中被注释为。 这是我的实体类: 这就是我进行全文搜索的地方: 有两种不同的查询。一个是在指定字段上进行全文通

  • 下面的lucene查询返回空字符串请帮忙,提前谢谢