在我的elasticsearch-index中,如果我的记录看起来像这样:
{
"date1": "<someDate>",
"date2": "<someOtherDate>"
}
是否可以通过&#34; date1&#34;进行查询,以便按顺序提供给我的文件。和&#34; data2&#34;字段?
例如,如果我有这些记录:
1: {"date1": "1950-01-01",
"date2": "2000-01-01"}
2: {"date1": "1960-01-01",
"date2": "1951-01-01"}
3: {"date1": "1970-01-01",
"date2": "1950-02-02"}
我想要接收它们的顺序应该是1,3,2因为1在date1字段中具有最早的日期,然后3在date2字段中具有下一个日期,然后在date2字段中具有2。 / p>
谢谢!
答案 0 :(得分:1)
根据ElasticSearch documentation,您有两种选择:
第一个选项要求您更改映射并放置如下文档:
PUT /my_index/my_type/1
{"date1": ["1950-01-01", "2000-01-01"]}
然后你就可以进行这样的查询:
GET /my_index/my_type/_search
{
"sort" : [
{ "date1" : {"order" : "asc", "mode": "min"}}
]
}
第二个选项是编写排序脚本,它适用于您的文档结构。这是一个例子:
GET /my_index2/_search
{
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"inline":
"if (doc['date1'].value < doc['date2'].value) { doc['date1'].value } else { doc['date2'].value} ",
"params" : {
"factor" : 1.1
}
},
"order" : "asc"
}
}
}
建议使用的脚本语言称为painless。
选择哪一个取决于您。性能可能是脚本选项的问题,painless
脚本仅在ES 5中引入(在ES 2.3中最接近的等效项是Groovy,默认情况下未启用,因为它很危险)。使用数组排序应该更快,因为它是一个内置功能,但需要以不同方式存储数据。