Solr4 max()函数似乎在TrieDateField值上失去了精度

时间:2014-09-05 21:48:15

标签: datetime solr solr4

我的文档有两个日期字段,“published_date”和“updated_date”。在更新发生之前,updated_date字段为空。在有更新后,我想使用updated_date作为字段进行排序。这不是确切的情况,但足够接近,索引一个正确的字段是最不理想的解决方案。

所以我正在尝试“sort = max(published_date,updated_date)desc”

要验证结果,我有“fl = max_date:max(published_date,updated_date),published_date,updated_date”

我所看到的是:

  "docs": [
  {
    "max_date": 1409953170000,
    "published_date": "2014-09-05T21:39:01.322Z",
    "updated_date": "2014-09-05T21:39:01.319Z"
  },
  {
    "max_date": 1409953040000,
    "published_date": "2014-09-05T21:36:51.614Z",
    "updated_date": "2014-09-05T21:36:51.611Z"
  },
  {
    "max_date": 1409953040000,
    "published_date": "2014-09-05T21:38:01.111Z",
    "updated_date": "2014-09-05T21:38:01.107Z"
  },
  {
    "max_date": 1409953040000,
    "published_date": "2014-09-05T21:38:11.151Z",
    "updated_date": "2014-09-05T21:38:11.148Z"
  },
  {
    "max_date": 1409953040000,
    "published_date": "2014-09-05T21:37:36.202Z",
    "updated_date": "2014-09-05T21:37:36.194Z"
  },
  {
    "max_date": 1409953040000,
    "published_date": "2014-09-05T21:37:41.92Z",
    "updated_date": "2014-09-05T21:37:41.915Z"
  }, ...

因此,您可以看到正在排序的max_date与基础时间戳的精度不同。结果是乱序的,max()的结果显然有更大的精确度,因为它总是以四个零结束。

那我该怎么做呢?或者solr的转换函数中有错误吗?

更新:

所以它似乎来自:lucene-solr-lucene_solr_4_5_0 / lucene / queries / src / java / org / apache / lucene / queries / function / valuesource / MaxFloatFunction.java

这表明max()是通过将它的参数强制转换为floatVal来实现的,因为日期在TrieField中存储为Longs,显然精度正在丢失。

2 个答案:

答案 0 :(得分:0)

Trie * -fields有their precision set by using precisionStep on the field。这样您就可以获得特定用途所需的精度。将64用作precisionStep实际上会使该字段成为常规的长/日期字段,您只能在函数查询中获得确切的值(因为Trie-fields会索引多个令牌)否则,要进行快速搜索工作)。

然而,更改此选项不会使范围查询的字段更快,因此您可能希望有一个字段用于排序,一个字段用于范围查询(如果需要)。

答案 1 :(得分:0)

我已经用SOLR打开了一个bug来解决这个问题。

https://issues.apache.org/jira/browse/SOLR-6490