在我的elasticsearch索引中,如果我有类似于以下内容的记录:
{
"date1": "<someDate>",
"date2": "<someOtherDate>"
}是否可以进行查询,按照"date1“和"data2”字段的顺序提供文档?
例如,如果我有这些记录:
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。
谢谢!
发布于 2017-06-22 17:06:45
根据ElasticSearch 文档的说法,您有两个选择:
1.使用数组进行排序
第一个选项要求您更改映射并将文档放置如下:
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"}}
]
}2.使用自定义脚本进行排序
第二个选项是编写排序脚本,它与文档结构一起工作。下面是一个示例:
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"
}
}
}建议使用的脚本语言称为无痛。
讨论
该选哪一个取决于你。性能可能是脚本选项的一个问题,而且只在ES 5中引入了painless脚本(在ES 2.3中,最接近的等价物是Groovy,默认情况下它是不启用的,因为它很危险)。使用数组进行排序应该更快,因为这是一个内置特性,但需要以不同的方式存储数据。
https://stackoverflow.com/questions/44678268
复制相似问题