如何使热门匹配结果多样化?

时间:2019-09-29 09:55:11

标签: elasticsearch lucene search-engine elasticsearch-aggregation

让我们从一个具体的例子开始。我有一个包含以下字段的文档:

{
  "template": {
    "mappings": {
      "template": {
        "properties": {
          "tid": {
            "type": "long"
          },
          "folder_id": {
            "type": "long"
          },
          "status": {
            "type": "integer"
          },
          "major_num": {
            "type": "integer"
          }
        }
      }
    }
  }
}

我想按字段folder_id聚合查询结果,并为除以folder_id的每个组检索前N个文档的_source详细信息。所以我写查询DSL,像这样:

GET /template/template/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "status": 1
          }
        }
      ]
    }
  }, 
  "aggs": {
    "folder": {
      "terms": {
        "field": "folder_id",
        "size": 10
      },
      "aggs": {
        "top_hit":{
          "top_hits": {
            "size": 5,
            "_source": ["major_num"]
          }
        }
      }
    }
  }
}

但是,现在提出了一个要求,即每个folder_id的热门匹配文档必须在字段major_num上多样化。对于每个folder_id,在top_hits集合下,子terms集合检索的热门命中文档在字段major_num上必须是唯一的,并且对于每个major_num值,最多返回1个文档(位于顶部)匹配结果。

top_hits聚合不能接受子聚合,那么我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

为什么不简单地在terms字段上添加另一个major_num聚合?

GET /template/template/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "status": 1
          }
        }
      ]
    }
  },
  "aggs": {
    "folder": {
      "terms": {
        "field": "folder_id",
        "size": 10
      },
      "aggs": {
        "majornum": {
          "terms": {
            "field": "major_num",
            "size": 10
          },
          "aggs": {
            "top_hit": {
              "top_hits": {
                "size": 1
              }
            }
          }
        }
      }
    }
  }
}