根据上述问题,我用Val给定的脚本进行的elasticsearch查询在最后一周之前都可以正常工作。我们已经升级了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停止使用脚本中包含“ as Integer”的代码。任何人都可以检查和帮助。
[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的结果。
billingSequence
确切地说,我的代码如下所示。
<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>
在这里,我通过了一个带有过滤器的聚合。我的过滤器工作正常,在聚合的地方,我遇到了问题。请检查并做有需要的事情。
看来您正在使用mvel脚本。您只需要指定要使用的名称即可groovy。
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 } } } }