【问题标题】:Elasticsearch Aggregation Scope IssueElasticsearch 聚合范围问题
【发布时间】:2017-04-12 14:27:07
【问题描述】:

我的 Elasticsearch 索引包含超过 1 亿 条记录。

如果我在查询下方运行,则响应会在 1 秒

内出现(1 条记录)
{
    "query": {
        "bool": {
            "must":{
                "term": {
                "_id": "a36403af960840b86452bf1a6bd42fde3b4773e0"
                }
            }

        }
    }
}

但如果我在查询下方运行,则响应会在 2 分钟以上。

{
    "query": {
        "bool": {
            "must":{
                "term": {
                "_id": "a36403af960840b86452bf1a6bd42fde3b4773e0"
                }
            }

        }
    },

    "aggs": {
        "mywordcloud": {
            "terms": {
                "field": "post.content_terms"
            }
        }
    }
}

我不知道为什么在 _id = a36403af960840b86452bf1a6bd42fde3b4773e0 仅匹配 1 条记录的查询顶部添加聚合后需要这么长时间。

根据我的假设,弹性搜索正在对数据输出应用聚合。所以从技术上讲,它应该在 1 条记录上运行聚合,并且响应必须在 1 秒内完成,与不使用 aggs 几乎相同。

如何解决这个问题?

我使用的是弹性搜索版本 1.5

【问题讨论】:

  • 你为什么不升级到最新的 5.3,它有很多改进,然后检查结果和响应时间。
  • 我计划升级,但不确定它是否能解决 aggs 范围问题。

标签: elasticsearch


【解决方案1】:

这是一个很好的例子,您需要考虑选择filter 上下文而不是query 上下文。

尝试使用filter 运行相同的查询,如下所示:

GET my-index/_search
{
    "query": {
        "bool": {
            "filter":{
                "term": {
                "_id": "a36403af960840b86452bf1a6bd42fde3b4773e0"
                }
            }

        }
    },

    "aggs": {
        "mywordcloud": {
            "terms": {
                "field": "post.content_terms"
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我的第一个建议

    是升级吗:- 我已经在 1.7.2 中尝试过您的第二个查询,速度非常快。我认为升级肯定会解决您的问题。

    第二个建议 不确定它是否适用于 Elastic Search 1.5 版。

    试试这个查询:-

    {
        "query": {
            "constant_score": {
                "filter":{
                    "term": {
                    "_id": "a36403af960840b86452bf1a6bd42fde3b4773e0"
                    }
                }
            }
        },
        "aggs": {
            "mywordcloud": {
                "terms": {
                    "field": "post.content_terms"
                }
            }
        }
    }
    

     {
            "aggregations": {
                "bylife": {
                    "terms": {
                        "field": "post.content_terms"
                    },
                    "aggregations": {
                        "bylife2": {
                            "filter": {
                                "term": {
                                    "_id": "a36403af960840b86452bf1a6bd42fde3b4773e0"
                                }
                            }
                        }
                    }
                }
            }
        }
    

    我知道这会给出不同的数据,但你可以用这种方法改变你的逻辑。

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2020-12-19
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多