需要在弹性搜索聚合结果中对_term进行排序

时间:2015-10-26 09:17:03

标签: elasticsearch

Need to Sort the _term in elastic search aggregation result

根据上面的问题,我使用Val给出的脚本的弹性搜索查询工作正常,直到上周。我们已经升级了ES版本,突然它停止了工作。

{
"size": 0,
"aggs": {
"count": {
  "terms": {
    "script": "doc.billingSequence.value as Integer",  <--- transform the terms to integers
    "order": {
      "_term": "asc"
    },
    "value_type": "integer",      <--- consider the terms as integer when sorting
    "size": 10
  }
}
}
}

现在我的ES突然停止使用包含&#34;作为整数&#34;的代码。在脚本中。任何人都可以检查和帮助。

[DEBUG] 2015-10-26 10:00:13,907 org.elasticsearch.action.search.type - [Eson the Searcher] [owce_assets][4], node[aNnn7tvHRi6tCkOA-RU2nw], [P], s[STARTED]: Failed to execute [org.elasticsearch.action.search.SearchRequest@123872f5] lastShard [true]
org.elasticsearch.search.SearchParseException: [owce_assets][4]: from[0],size[100]: Parse Failure [Failed to parse source [{"from":0,"size":100,"aggregations_binary":"ewoJCQkJCQkiY291bnQiOiB7IAoJCQkJCQkJInRlcm1zIjogewoJCQkJCQkJCSJzY3JpcHQiOiJkb2MuYmlsbGluZ1NlcXVlbmNlLnZhbHVlIGFzIEludGVnZXIiLAoJCQkJCQkJCSJvcmRlciI6IHsKCQkJCQkJCQkgICJfdGVybSI6ICJhc2MiCgkJCQkJCQkJfSwKCQkJCQkJCQkidmFsdWVfdHlwZSI6ICJpbnRlZ2VyIiwgICAgIAoJCQkJCQkic2l6ZSI6IDIwCgkJCQkJCQkJCgkJCQkJCQkgfQoJCQkJCQl9CgkJCQkJfQ=="}]]
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:634)
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:507)
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:480)
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:252)
    at org.elasticsearch.search.action.SearchServiceTransportAction.sendExecuteQuery(SearchServiceTransportAction.java:202)
    at org.elasticsearch.action.search.type.TransportSearchQueryThenFetchAction$AsyncAction.sendExecuteFirstPhase(TransportSearchQueryThenFetchAction.java:80)
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.performFirstPhase(TransportSearchTypeAction.java:216)
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.performFirstPhase(TransportSearchTypeAction.java:203)
    at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$2.run(TransportSearchTypeAction.java:186)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: [Error: unknown class or illegal statement: org.elasticsearch.common.mvel2.ParserContext@7915fb96]
[Near : {... doc.billingSequence.value as Integer ....}]
                                         ^

我已尝试过给定的查询,现在抛出以下异常。

[DEBUG] 2015-10-26 10:33:01,912 org.elasticsearch.action.search.type - [Eson the Searcher] [owce_assets][4], node[aNnn7tvHRi6tCkOA-RU2nw], [P], s[STARTED]: Failed to execute [org.elasticsearch.action.search.SearchRequest@66accd25] lastShard [true]
org.elasticsearch.search.SearchParseException: [owce_assets][4]: from[0],size[100]: Parse Failure [Failed to parse source [{"from":0,"size":100,"aggregations_binary":"ewoiY291bnQiOiB7CiAgInRlcm1zIjogewogICAgInNjcmlwdCI6ICJkb2MuYmlsbGluZ1NlcXVlbmNlLnZhbHVlIGFzIEludGVnZXIiLAogICAgIm9yZGVyIjogewogICAgICAiX3Rlcm0iOiAiYXNjIgogICAgfSwKICAgICJ2YWx1ZV90eXBlIjogImludGVnZXIiLAogICAgInNpemUiOiAxMCwKICAgICJsYW5nIjogImdyb292eSIgICAgICAgICAgICAKICB9Cn0KfQ=="}]]
at org.elasticsearch.search.SearchService.parseSource(SearchService.java:634)
at org.elasticsearch.search.SearchService.createContext(SearchService.java:507)
at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:480)
at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:252)
at org.elasticsearch.search.action.SearchServiceTransportAction.sendExecuteQuery(SearchServiceTransportAction.java:202)
at org.elasticsearch.action.search.type.TransportSearchQueryThenFetchAction$AsyncAction.sendExecuteFirstPhase(TransportSearchQueryThenFetchAction.java:80)
at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.performFirstPhase(TransportSearchTypeAction.java:216)
at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction.performFirstPhase(TransportSearchTypeAction.java:203)
at org.elasticsearch.action.search.type.TransportSearchTypeAction$BaseAsyncAction$2.run(TransportSearchTypeAction.java:186)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.elasticsearch.ElasticsearchIllegalArgumentException: script_lang not supported [groovy]
at org.elasticsearch.script.ScriptService.compile(ScriptService.java:143)
at org.elasticsearch.script.ScriptService.search(ScriptService.java:163)
at
org.elasticsearch.search.aggregations.bucket.terms.TermsParser.parse(TermsParser.java:202)
at org.elasticsearch.search.aggregations.AggregatorParsers.parseAggregators(AggregatorParsers.java:114)
at org.elasticsearch.search.aggregations.AggregatorParsers.parseAggregators(AggregatorParsers.java:77)
at org.elasticsearch.search.aggregations.AggregationParseElement.parse(AggregationParseElement.java:60)
at org.elasticsearch.search.aggregations.AggregationBinaryParseElement.parse(AggregationBinaryParseElement.java:42)
at org.elasticsearch.search.SearchService.parseSource(SearchService.java:622)
... 11 more

我作为参数传递的查询是::

{
    "count": { 
        "terms": {
            "script": "Integer.parseInt(doc.billingSequence.value)",
                "order": {
                              "_term": "asc"
                            },
                              "value_type": "integer",
                            "size": 20

                         }
                    }
                }

由于我的索引器在billingSequence字段中包含1,2,4,6,14个值。但在执行此查询后,我只在结果中得到2,4,6。

我的代码完全如下所示..

<mix:variable name="aggregations" as="xs:string">
   <mix:option name="disable-expression-parsing" value="true"/>
       {
            "fatal_errors": {
                "filter": { 
                    "and":[
                        <!-- Filter by date (if given). Value should be send as "`DATE#" and the period should be in Filter data(<Filter name="field_name" value="`DATE#">1d</Filter>).-->
                        <mix:for-each select="//Date">
                            <mix:if test="$comma">,</mix:if>
                                { "range": {
                                    "<mix:value-of select='./@name'/>": {
                                        "gte": "now-<mix:value-of select='./@value'/>",
                                            "lt": "now"
                                        }
                                    }
                                 }
                            <mix:global-variable name="comma" select="true()" as="xs:boolean"/>
                         </mix:for-each>    

                        <!-- Filter all the not nulls or blanks in a field (if given). Value should be send as "`NOT_NULL#" (<Filter name="field_name" value="`NOT_NULL#"></Filter>).-->
                        <mix:for-each select="//NotNull">
                            <mix:if test="$comma">,</mix:if>
                                {
                                    "not":
                                        {
                                            "term":{
                                                "<mix:value-of select='./@name'/>":""
                                            }
                                     }
                                }
                            <mix:global-variable name="comma" select="true()" as="xs:boolean"/>
                        </mix:for-each>                                                 

                        <mix:for-each select="//FitlerTerm">
                            <mix:if test="$comma">,</mix:if>
                                {
                                    "term":{
                                        "<mix:value-of select='./@name'/>":"<mix:value-of select='./@value'/>"
                                    }
                                }
                            <mix:global-variable name="comma" select="true()" as="xs:boolean"/>
                        </mix:for-each> 
                    ]
                },
                "aggs": {
                    "count": { 
                        "terms": {
                            "script": "Integer.parseInt(doc.billingSequence.value)",
                            "order": {
                              "_term": "asc"
                            },
                              "value_type": "integer",
                            "size": 20

                         }
                    }
                }

            }
        }
        <mix:option name="disable-expression-parsing" value="false"/>
</mix:variable>

这里我传递带过滤器的聚合..我的过滤器工作正常,在聚合的地方我得到了问题。请检查并做必要的事情。

1 个答案:

答案 0 :(得分:3)

您似乎正在使用mvel脚本。您只需指定要使用groovy代替。

{
"size": 0,
"aggs": {
"count": {
  "terms": {
    "script": "doc.billingSequence.value as Integer",
    "order": {
      "_term": "asc"
    },
    "value_type": "integer",
    "size": 10,
    "lang": "groovy"              <--- add this line
  }
}
}
}

另外,请确保将此项包含在项目依赖项中,因为默认情况下不包括此项:

    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.0</version>
        <scope>compile</scope>
        <optional>true</optional>
    </dependency>

更新

如果你真的不能使用Groovy,你可以坚持使用MVEL并使用MVEL类型转换:

{
"size": 0,
"aggs": {
"count": {
  "terms": {
    "script": "Integer.parseInt(doc.billingSequence.value)",   <--- change this line
    "order": {
      "_term": "asc"
    },
    "value_type": "integer",
    "size": 10
  }
}
}
}