我的文档有两个日期字段,“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,显然精度正在丢失。
答案 0 :(得分:0)
Trie * -fields有their precision set by using precisionStep
on the field。这样您就可以获得特定用途所需的精度。将64
用作precisionStep
实际上会使该字段成为常规的长/日期字段,您只能在函数查询中获得确切的值(因为Trie-fields会索引多个令牌)否则,要进行快速搜索工作)。
然而,更改此选项不会使范围查询的字段更快,因此您可能希望有一个字段用于排序,一个字段用于范围查询(如果需要)。
答案 1 :(得分:0)
我已经用SOLR打开了一个bug来解决这个问题。