如何在elasticsearch

时间:2015-11-15 14:23:44

标签: elasticsearch

我在elasticsearch中有一个复杂的查询。它很慢。我想优化它。 但我不知道如何工作。 如何解释查询,就像Sql解释一样。

我看到elastichsearch _valite / query?解释。它可以解释得分。 但我需要查看详细的执行计划。

{
  "post_filter": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "base.sysCode": "2801"
                }
              },
              {
                "term": {
                  "base.status": [
                    12,
                    0
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "fields": [
    "base.sysCode",
    "base.orderNo"
  ]
}

结果

{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "odi_bus_betad_2013",
"valid": true,
"explanation": "ConstantScore(*:*)"
}
]
}

4 个答案:

答案 0 :(得分:18)

解释API

计算查询和特定文档的分数说明。无论文档是否与特定查询匹配,都可以提供有用的反馈。

添加"profile": true

GET /_search
{
  "profile": true,
  "query" : {
    "match" : { "user" : "kimchy" }
  }
}

Explain Documentation

个人资料API

提供有关搜索请求中各个组件执行的详细计时信息。它使用户能够深入了解如何在较低级别执行搜索请求,以便用户可以理解为什么某些请求很慢,并采取措施来改进它们。

添加{{1}}

{{1}}

Profile Documentation

答案 1 :(得分:4)

如果您运行的是最新版本,请将个人资料关键字粘贴到您的查询中:

GET binary/_search
{
   "profile": true,
    "query": {
     ...
        }
    }
}

如果你有X-Pack,你可以使用基于GUI的分析器来查看它的缓慢。可悲的是在开源版本中没有,但它只是上面输出的一个更漂亮的版本 - https://www.elastic.co/guide/en/kibana/5.6/xpack-profiler.html

您可能可以进行30天的试用,或者如果您幸运,也许您已经拥有X-Pack许可证。

答案 2 :(得分:2)

Explain API的用法是here

  

explain api计算查询和a的分数解释   具体文件。这可以提供有用的反馈是否是文档   匹配或与特定查询不匹配。

答案 3 :(得分:1)

你做的一切都是正确的。您使用explain运行了查询,Elasticsearch确实在explanations下显示了详细的执行计划。

然而,这里详细的执行计划显然没有任何细节;这是因为你实际上根本没有运行查询。您只运行了post_filter(示例中的第一个关键字。)

由于您根本没有指定查询,因此Elasticsearch会匹配索引中的每个文档,并对所有文档应用常量分数。这就是为什么,在explanations下,您会看到:"explanation": "ConstantScore(*:*)"

由于索引中的每个文档都匹配,因此您指定的post_filter将应用于每个文档。这本身已经很慢了;更糟糕的是,后期过滤器永远不会被缓存。 (https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html)因此,explain永远不会告诉您示例的任何过滤器或缓存信息,即使它可以。

所以,回答你的问题:explain已经返回了Elasticsearch根据你的具体例子提供的最详细的执行计划。您可以尝试使用常规filter而不是post_filter来为Elasticsearch提供构建缓存和提高性能的机会。