首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticseach,交叉日期字段排序

Elasticseach,交叉日期字段排序
EN

Stack Overflow用户
提问于 2017-06-21 13:59:03
回答 1查看 35关注 0票数 0

在我的elasticsearch索引中,如果我有类似于以下内容的记录:

代码语言:javascript
复制
{
    "date1":  "<someDate>",
    "date2":   "<someOtherDate>"
}

是否可以进行查询,按照"date1“和"data2”字段的顺序提供文档?

例如,如果我有这些记录:

代码语言:javascript
复制
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。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-22 17:06:45

根据ElasticSearch 文档的说法,您有两个选择:

  1. 使用排序模式选项进行数组排序
  2. 使用自定义排序脚本进行排序

1.使用数组进行排序

第一个选项要求您更改映射并将文档放置如下:

代码语言:javascript
复制
PUT /my_index/my_type/1
{"date1": ["1950-01-01", "2000-01-01"]}

然后,您将能够进行如下查询:

代码语言:javascript
复制
GET /my_index/my_type/_search
{
    "sort" : [
        { "date1" : {"order" : "asc", "mode": "min"}}
    ]
}

2.使用自定义脚本进行排序

第二个选项是编写排序脚本,它与文档结构一起工作。下面是一个示例:

代码语言:javascript
复制
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,默认情况下它是不启用的,因为它很危险)。使用数组进行排序应该更快,因为这是一个内置特性,但需要以不同的方式存储数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44678268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档