需要对弹性搜索聚合结果中的_term进行排序 [英] Need to Sort the _term in elastic search aggregation result

查看:33
本文介绍了需要对弹性搜索聚合结果中的_term进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

根据上述问题,我用Val给定的脚本进行的弹性搜索查询在最后一周之前都可以正常工作.我们已经升级了ES版本,突然它停止了工作.

As per the above question, my elastic search query with the script given by the Val worked fine till the last week. We have upgraded the ES version and suddenly it stopped working.

{
"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突然停止使用脚本中包含"as Integer"的代码.任何人都可以检查和帮助.

Now suddenly my ES stopped working with code containing "as Integer" in script. Can anyone please check and help.

[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 ....}]
                                         ^

我尝试了给定的查询,现在它抛出以下异常.

I have tried the given query and now it throws the below exception.

[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

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

The query I am passing as a parameter is::

{
    "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.

As my indexer contains 1, 2, 4, 6, 14 values in the billingSequence field. But after executing this query, I am getting 2, 4, 6 only in the result.

我的代码确实如下所示.

Exactly my code goes like below..

<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>

在这里,我通过了带有过滤器的聚合.我的过滤器工作正常,在聚合的地方,我遇到了问题.请检查并做有需要的事情.

Here I am passing an aggregation with filter.. My filter is working fine and at the place of aggregation I am getting the issue. Please check and do the needful.

推荐答案

似乎您正在使用 mvel 脚本.您只需要指定要使用 groovy 即可.

It seems that you're using mvel scripting. You simply need to specify that you want to use groovy instead.

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

还要确保将其包括在项目依赖项中,因为默认情况下不包括此项:

Also make sure that you include this to your project dependencies as it's not included by default:

    <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类型转换:

If you really cannot use Groovy, you can stick to MVEL and use MVEL type casting instead:

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

这篇关于需要对弹性搜索聚合结果中的_term进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆