使用带脚本排序的top_hits字段进行弹性搜索聚合

时间:2017-03-02 21:22:50

标签: database elasticsearch nested-queries

我有一组包含srctxtflt字段的文档。我想通过以下方式按txt字段进行查询:

  1. 分组(bucketize)src;
  2. 在每个桶中计算前1个最相关的文档;
  3. _score * doc.flt值对每个广告订单进行排序。
  4. 到目前为止,我已经实现了1和2,但不是3.即使3可能效率不高,我仍然希望有这样的选择。我的查询如下:

    {
        "query" : {
            'match' : {
                'text' : {
                    'query' : <some text>,
                    'fuzziness' : 'AUTO',
                    'operator' : 'and'
                }
            }
        },
        "aggs": {
            "by_src": {
                "terms": {
                    "field": "src",
                    "size" : 10,
                    "order" : {"top_score" : "desc"}
                },
                "aggs": {
                    "top_hits" : {
                        "top_hits" : {
                            "sort": { "_score": {  "order": "desc" } },
                            "size" : 1
                        }
                    },
                    "top_score": {
                        "max" : {
                            "script" : "_score",
                        }
                    }
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

我认为它失败了,因为您不需要使用_source字段将排序应用于每个存储桶,只需按字段名称应用排序:

{
  "query" : {
    'match' : {
        'text' : {
            'query' : <some text>,
            'fuzziness' : 'AUTO',
            'operator' : 'and'
        }
    }
},
"aggs": {
    "by_src": {
        "terms": {
            "field": "src",
            "size" : 10,
            "order" : {"top_score" : "desc"}
        },
        "aggs": {
            "top_hits" : {
                "top_hits" : {
                    "sort":[{
                        "flt": {"order": "desc"}
                    }],
                    "size" : 1
                }
            },
            "top_score": {
                "max" : {
                    "script" : "_score",
                }
            }
        }
    }
  }
}
  

我假设您的文档中有一个名为flt的字段,您想要用它来排序。当然,如果符合您的要求,您也可以将排序更改为asc