将日期转换为字符串弹性搜索

时间:2017-04-21 12:45:01

标签: elasticsearch sense

我希望从弹性搜索的日期开始。我的映射就像 -

"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)

如果我可以选择将字段值日期转换为字符串而不更改我的实际映射类型,则会得到正确的值。因此,请建议如何在弹性搜索查询中转换字符串。 或者,如果有任何其他选择从年初获得年份,那么也建议。

2 个答案:

答案 0 :(得分:2)

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

{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "left_field" : {
            "script" : {
                "inline": "doc.timeModified.date.getYear()"
            }
        }
    }
}

答案 1 :(得分:1)

脚本就像doc['timeModified'].date.year一样简单。知道该字段属于date类型,ES会公开.date快捷方式,可以使用.year之类的内容。