在elasticsearch中给定字段中的值聚合排序

时间:2017-10-12 03:15:48

标签: sorting elasticsearch elasticsearch-2.0

我的索引中有以下字段

field1:{key:value}

是否可以在field1中对值的总和进行查询。 感谢

1 个答案:

答案 0 :(得分:0)

这是你可以做到这一点的一种方式,假设你提前了解了这些领域。如果您需要通配符字段,应该可以进行一些细微的改进。这假设嵌套类型上的兄弟字段是数字。

示例映射:

  "test": {
    "mappings": {
      "type1": {
        "properties": {
          "field1": {
            "properties": {
              "key1": {
                "type": "integer"
              },
              "key2": {
                "type": "integer"
              }
            }
          }
        }
      }
    }
  }

默认结果:

  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "test",
        "_type": "type1",
        "_id": "AV8O7956gIcGI2d5A_5g",
        "_score": 1,
        "_source": {
          "field1": {
            "key1": 11,
            "key2": 17
          }
        }
      },
      {
        "_index": "test",
        "_type": "type1",
        "_id": "AV8O78FqgIcGI2d5A_5f",
        "_score": 1,
        "_source": {
          "field1": {
            "key1": 5,
            "key2": 6
          }
        }
      }
    ]
  }

使用脚本查询:

GET /test/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "script_score": {
            "script": "return (doc['field1.key1'].value + doc['field1.key2'].value) * -1"
          }
        }
      ]
    }
  }
}

将得分最低的逻辑作为最佳得分(在这种情况下最少为负):

{
  "took": 18,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": -11,
    "hits": [
      {
        "_index": "test",
        "_type": "type1",
        "_id": "AV8O78FqgIcGI2d5A_5f",
        "_score": -11,
        "_source": {
          "field1": {
            "key1": 5,
            "key2": 6
          }
        }
      },
      {
        "_index": "test",
        "_type": "type1",
        "_id": "AV8O7956gIcGI2d5A_5g",
        "_score": -28,
        "_source": {
          "field1": {
            "key1": 11,
            "key2": 17
          }
        }
      }
    ]
  }
}

希望这能为您提供所需的任何特定评分逻辑的要点