Elasticsearch自定义分类排序,不带脚本

时间:2016-02-11 16:21:46

标签: sorting elasticsearch groovy

我在ElasticSearch的文档中有一个分类字段(让我们称之为var m=(document.compatMode == 'CSS1Compat') ? 'Standards' : 'Quirks'; window.alert(m+'-mode.'); ),我想实现以下排序算法:

  1. 如果political_partypolitical_partyD,请填入第一个存储桶。如果它是R,那么它们应该全部结束。
  2. 在这两个存储桶中,结果应按G排序。
  3. 我知道这可以这样做:

    date_registered

    但是,由于脚本运行所需的配置以及我们托管的ElasticSearch供应商提供的一些限制,我需要使用{ "sort": [ { "_script": { "script": "doc['political_party'].value == 'G' ? 0 : 1", "type": "number", "order": "desc" } }, { "date_registered": { "order": "desc" } } ] } 字段不使用执行此操作。怎么办呢?

1 个答案:

答案 0 :(得分:0)

由于默认排序是在_score字段上完成的,因此您可以使用function_score query计算自定义分数以匹配上述约束。无需编写脚本。

主要思想是对political_partyDR的所有文档赋予权重2(并为G保留默认权重1)然后根据其date_registered字段对每个文档进行评分。

会是这样的:

{
  "query": {
    "function_score": {
      "boost_mode": "replace",
      "functions": [
        {
          "filter": {
            "terms": {
              "political_party": [
                "D",
                "R"
              ]
            }
          },
          "weight": 2
        },
        {
          "field_value_factor": {
            "field": "date_registered",
            "factor": 1,
            "modifier": "none"
          }
        }
      ]
    }
  }
}

通过此查询,所有DR文档都会冒泡到顶部,G文档将会关闭。所有内容都将根据date_registered字段进行排序。