首页 > 解决方案 > Elasticsearch 获得具有相同字段值的最大 n 个结果

问题描述

我正在尝试从 Elasticsearch 查询中获取随机结果列表,而大多数文档的字段 ( )n具有相同的值。keywordfield1

我的方法是使用折叠查询并收集每个外部命中的内部命中,将每个内部命中设置为.sizen

这是查询(带n=5):

{
    "query": {
        "function_score": {
            "query": {
                "match": {
                    "field1": "value1"
                }
            },
            "functions": [
                {
                    "random_score": {}
                }
            ]
        }
    },
    "collapse": {
        "field": "field2",
        "inner_hits": {
            "name": "field2_hits",
            "size": 5
        }
    }
}

结果看起来如预期:

{
 ...
 hits=[
  {
                "_index": "my_index",
                "_type": "_doc",
                "_id": "7d0203f72780da89ce349b69985a070b73adad9de79e65c5a1cb316dd2c00504",
                "_score": 3.3316212,
                "_source": {...},
                "fields": {
                    "field2": [ "value1" ]
                },
                "inner_hits": {
                    "field2_hits": {
                        "hits": {
                            "total": {
                                "value": 10000,
                                "relation": "gte"
                            },
                            "max_score": 3.3304589,
                            "hits": [...]
                        }
           ...}

在收集内部命中时,我注意到,不同外部命中的内部命中可以是相同的(相同的 id)。

在某种程度上,这似乎是合乎逻辑的,因为可以检索任意数量的带有值的外部命中:Xfield2

因此,如果我收集每个外部命中的所有内部命中,则命中 C 和 D 是重复的。然而,对于我的用例,这不是我想要的。我想我只需要每个值只需要一个外部命中field2,以便所有内部命中在结果集中都是唯一的。

另一个问题是,设置一个 largen会给 ES 服务器带来高负载,所以这可能是完全错误的方法。我的问题是:

如何从索引中获取一组 k 个随机文档,其中n文档最大值对于特定字段具有相同的值?

标签: elasticsearchsearchrandom

解决方案


推荐阅读