荐 Solr 按日期facet 差8小时问题解决

2019-03-27 01:23|来源: 网路

项目中使用solrj来操作solr,日期solr会自动转换:

1.solrj在提交到solr时,时间会因为时区问题减少八小时

2.solr接收到时间后,存为底层lucene索引时时间类型为long型,是正确的时区时间,但是使用solr web界面查询会看到时间会少八小时

3.在使用solrj查询时,solr返回给solrj的为lucene索引,是long型,solrj直接执行new Date传入该long型获得了正确的时间。

由于solr存储的时间类型少了八小时,而进行日期facet的时候根据的正是使用solr,所以导致日期区间内数据量不正确,特别是以日为区间时。

我的解决办法为将solr的存储日期也改为当前时间,不让它有八小时时差,facet时日期就不会出错。

所以需要修改solrj查询和入库时对日期的处理。

修改solrj包org.apache.solr.common.util下两个类:

入库修改DateUtil类里面181行:

private static class ThreadLocalDateFormat extends ThreadLocal<DateFormat> {
    DateFormat proto;

    public ThreadLocalDateFormat() {
      super();
      //2007-04-26T08:05:04Z
      SimpleDateFormat tmp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
      proto = tmp;
    }



这里去掉了
tmp.setTimeZone(UTC);



因为设置时区后使用format会少八小时。

修改查询JavaBinCodec 类199行:

 case DATE:
                Long timeLong = dis.readLong();
                //cut 8 hours
                timeLong = timeLong - 8 * 60 * 60 * 1000;
                return new Date(timeLong);



这里将日期减去了8小时。

然后编译这两个类替换掉solrj里相应包目录下的class文件,放入项目中,然后入库和查询,发现时间不会再差八小时。当然,按日期facet时结果也不会再有错

修改后的solrj只需要放到项目中,solr源码里面的依赖solrj不需要修改








转自:http://my.oschina.net/132722/blog/283418

相关问答

更多
  • 我无法通过Solr或插件配置找到这样做的方法,所以我开发了一种方法来有效地创建组构面计数,同时仍然使用CollapsingQParserPlugin。 我这样做是通过复制我将要面对的字段并确保整个组的所有方面值都在每个文档中,如下所示: "docs": [ { "id": "1", "workId": "abc", "type": "book", "facetType": [ "book", "ebook" ] }, { " ...
  • 使用json方面 : { prices: { type: range, field: timestamp, start: "NOW/MONTH", end:"NOW/MONTH+1MONTH", gap: "+1DAY", facet:{ x : "avg(price)", y : "sum(price)" } } } 为了获得平均值,每个桶的avg等,请查看您可以 ...
  • 您的问题是要按方面值进行过滤。 一个过滤器,它只限制结果列表,但不限制相应的构面字段。 您正在寻找的是标记过滤器查询 : q=my+main+query&fq={!tag=brandTag}brand%3A"Flipkart"&facet=true&facet.field={!ex=brandTag}brand Your question is about to filter by a facet-value. A filter which does only restrict the resultlis ...
  • 在Solr 4.2.1中尝试了日期刻面并且它没有返回正确的值。 它像维基说的那样被弃用了。 相反,我尝试了范围刻面 ,它工作正常: q=*:*&wt=json&rows=0&facet=true&facet.range=PRESENTDATE&facet.range.start=2011-12-01T00:00:00Z&facet.range.end=2012-06-01T23:59:59Z&facet.range.gap=%2B1MONTH Tried date faceting in Solr 4.2. ...
  • 这是一个已知问题,并且存在一个问题。 请点击https://issues.apache.org/jira/browse/SOLR-6329 也似乎使用minCount = 0处理过多的文档不必要,并使用太多的内存,这可能会解释崩溃的节点。 检查这个jira https://issues.apache.org/jira/browse/SOLR-11711 This is a known issue and there is a issue open for this. check here https://i ...
  • 您可以使用构面查询而不是构面范围来完成所要求的内容。 尝试这样的事情: facet.query=myDateField:[NOW-11MONTH/MONTH TO NOW-10MONTH/MONTH] facet.query=myDateField:[NOW-10MONTH/MONTH TO NOW-9MONTH/MONTH] facet.query=myDateField:[NOW-9MONTH/MONTH TO NOW-8MONTH/MONTH] ... 等等。 现在你可以完全控制任何一个方面, ...
  • 对于过滤器查询,如果未指定该字段,则查询将在默认字段上起作用。 您可以通过添加debugQuery=on来检查执行的过滤器查询 text:solr100 因此,检查默认字段是否应具有CABERNET术语。 此外,匹配将取决于字段类型,执行的分析以及字段索引与否的位置。 只有索引的字段才能过滤结果。 For the filter queries if the field is not speci ...
  • 无法找到合适的解决方案,但猴子修补它像这样: Post.solr_search do facet(:comments_count) do row('No') { with(:comments_count).less_than 1 } row('Yes') { with(:comments_count).greater_than 0 } end case params[:comments_count] when 'No' with(:comments_coun ...
  • 我认为你错误地解释了日期方面的结果。 IIRC,由于您定义了1个月的差距,结果'2009-12-28T18:00:00Z' => 396386意味着在2009-12-28T18:00:00Z和2010-01-28T18:00:00Z之间(一个月内有396386条结果。 但是,您正在运行具有确切日期的过滤器查询,并且您没有得到任何结果,因为没有文档完全匹配该日期和时间。 如果您想获取这些396386文档,请运行一个过滤查询,其范围介于上面提到的日期之间: fq=photo_added:[2009-12-28T ...
  • WordDelimiterFilterFactory导致您的下划线被删除。 基于以下内容: 将单词拆分为子词并对子词组执行可选的转换。 默认情况下,使用以下规则将单词拆分为子词: 在字内分隔符上拆分(所有非字母数字字符)。 “Wi-Fi” - >“Wi”,“Fi” ... 根据您如何使用此字段的说明 - “我想要存储的方面是字符串...” 。 我建议您使用下面定义的string fieldType(来自Solr示例),除非您确实需要应用其他分析器。