1

我想在弹性搜索中从日期开始获取年份。我的映射就像 -

"timeModified": 
{
   "type": "date",
    "format": "strict_date_optional_time||epoch_millis"
}

我在弹性搜索中的数据存储是 -

"timeModified": "2015-03-12T13:18:50.000+05:30"

我想从日期开始获取年份。当我执行以下查询时 -

{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "left_field" : {
            "script" : {
                "inline": "doc.timeModified.value.substring(0, length)",
                "params": {
                    "length": 4
                }
            }
        }
    }
}

它给了我例外-

"方法没有签名:java.lang.Long.substring() 适用于参数类型:(java.lang.Integer, java.lang.Integer) 值:[0, 4]\n可能的解决方案:toString(), toString (), toString(), toString(long, int) "

如果我可以选择将字段值日期转换为字符串而不改变我的实际映射类型,我会得到正确的值。所以请建议如何在弹性搜索查询中转换字符串。或者,如果有任何其他选项可以从日期开始计算,那么也建议。

4

2 回答 2

3

您得到的错误是因为字段值Long不是 a String。但是,您也可以通过以下date方式直接访问该值:

{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "left_field" : {
            "script" : {
                "inline": "doc.timeModified.date.getYear()"
            }
        }
    }
}
于 2017-04-21T12:47:19.993 回答
1

脚本很简单doc['timeModified'].date.year。知道 field 是 type date,ES 公开了可以使用.date类似的东西的快捷方式。.year

于 2017-04-21T12:58:51.157 回答