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>
这里我传递带过滤器的聚合..我的过滤器工作正常,在聚合的地方我得到了问题。请检查并做必要的事情。
答案 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
}
}
}
}