调试ElasticSearch布尔查询

时间:2014-05-21 13:10:01

标签: elasticsearch

我遇到了自动生成的elasticSearch查询的问题。运行它时,我在索引上使用的七个分片中有六个返回成功,第七个返回此错误:

index: "shard"
reason: "ClassCastException[
  org.elasticsearch.common.mvel2.compiler.BlankLiteral cannot be cast to java.lang.Boolean]"
shard: 1
status: 500
successful: 6
total: 7

如果由于根查询是bool而导致解释端点完全没有产生,我怎么能弄清楚这是什么呢?

查询如下:

{
  "query": {
    "bool": {
      "must": [
        {
          "filtered": {
            "query": {
              "range": {
                "date": {
                  "lte": "2014-05-21T21:59:59+00:00",
                  "gte": "2013-01-23T23:00:00+00:00"
                }
              }
            },
            "filter": {
              "not": {
                "terms": {
                  "idCountry": [
                    "9999"
                  ]
                }
              }
            }
          }
        },
        {
          "filtered": {
            "query": {
              "nested": {
                "path": "reports",
                "query": {
                  "terms": {
                    "reports.36317.flag": [
                      "o"
                    ],
                    "minimum_should_match": 1
                  }
                }
              }
            },
            "filter": {
              "nested": {
                "path": "reports",
                "filter": {
                  "exists": {
                    "field": "reports.36317"
                  }
                }
              }
            }
          }
        }
      ]
    }
  },
  "script_fields": {
    "idTone": {
      "script": "_source.reports[reportId].empty || _source.reports[reportId].idTone.empty ? _source.idLanguage : _source.reports[reportId].idTone",
      "params": {
        "reportId": "36317"
      }
    },
    "tags": {
      "script": "_source.reports[reportId].empty || _source.reports[reportId].tags.empty ? 'none' : _source.reports[reportId].tags",
      "params": {
        "reportId": "36317"
      }
    },
    "flag": {
      "script": "_source.reports[reportId].empty || _source.reports[reportId].flag.empty ? 'O' : _source.reports[reportId].flag",
      "params": {
        "reportId": "36317"
      }
    },
    "synthesioRank": {
      "script": "_source.reports[reportId].empty || _source.reports[reportId].synthesioRank.empty || _source.reports[reportId].synthesioRank == null ? '0' : _source.reports[reportId].synthesioRank",
      "params": {
        "reportId": "36317"
      }
    },
    "idUserEngagement": {
      "script": "_source.reports[reportId].empty || _source.reports[reportId].idUserEngagement == null ? '0' : _source.reports[reportId].idUserEngagement",
      "params": {
        "reportId": "36317"
      }
    },
    "idStatus": {
      "script": "_source.reports[reportId].empty || _source.reports[reportId].idStatus == null ? '0' : _source.reports[reportId].idStatus",
      "params": {
        "reportId": "36317"
      }
    }
  },
  "fields": [
    "access",
    "content",
    "title",
    "date",
    "geo",
    "idItem",
    "idSiteType",
    "idSite",
    "idSource",
    "idSourceType",
    "idTopic",
    "media",
    "url",
    "idLanguage",
    "idDocument",
    "idCountry"
  ]
}

1 个答案:

答案 0 :(得分:1)

抛出的异常与mvel有关,mvel是你案例中用于script_fields的脚本语言。

只有一个分片失败的事实可能意味着你的一个脚本字段的执行对该分片中的一个特定文档失败。

您可以尝试逐个删除这些字段以及请求该字段的任何过滤器,以找出失败的字段。

注意:Explain API旨在帮助理解排序查询中的评分计算。对于查询失败,它不会以任何方式帮助您。