在ElasticSearch中使用其他逻辑对多列进行排序

时间:2016-04-12 08:46:06

标签: elasticsearch

有时在我的结果集中,我的项目具有相同的_score并且没有问题,但我想提取start_date和end_date介于" now"之间的文档。在同一个_score中。

基本上我想在ElasticSearch中完成相同的工作:

SELECT * FROM tbl WHERE ... ORDER BY _score DESC, (start_date <= NOW() AND NOW() <= end_date) DESC

我该怎么做?

1 个答案:

答案 0 :(得分:2)

如何在查询分数计算本身中集成(start_date <= NOW() AND NOW() <= end_date)比较呢?

  "query": {
    "bool": {
      "must": [
        // your query here
      ],
      "should": [
        {
          "bool": {
            "must": [
              {
                "range": {
                  "start_date": {
                    "lte": "2015-03-03"
                  }
                }
              },
              {
                "range": {
                  "end_date": {
                    "gte": "2015-03-03"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }

或者,也可以使用脚本:

  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "_script": {
        "type": "number",
        "script": "def now_date=new DateTime(new Date()); if (doc['start_date'].date <= now_date && doc['end_date'].date >= now_date) return 1; return 0",
        "order": "desc"
      }
    }
  ]