Elasticseach,在交叉日期字段上排序

时间:2017-06-21 13:59:03

标签: elasticsearch

在我的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>

谢谢!

1 个答案:

答案 0 :(得分:1)

根据ElasticSearch documentation,您有两种选择:

  1. 使用Sort mode option
  2. 对数组进行排序
  3. 使用自定义sorting script
  4. 排序

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

    建议使用的脚本语言称为painless

    讨论

    选择哪一个取决于您。性能可能是脚本选项的问题,painless脚本仅在ES 5中引入(在ES 2.3中最接近的等效项是Groovy,默认情况下未启用,因为它很危险)。使用数组排序应该更快,因为它是一个内置功能,但需要以不同方式存储数据。