2016-07-26 7 views
0

をグルーヴィーなスクリプトを実行中にエラーが発生しました私はfunction_score機能を使用してスコア計算を変更したい、私のクエリです:elasticsearchに以下

{ 
    "size": 1, 
    "query":{ 
     "function_score": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "match": { 
       "messageText": "car" 
      } 
      } 
     ] 
     } 
    }, 
    "script_score" : { 
     "script" : "doc['time_views'].values[doc['time_views'].values.length-1]" 
    } 
    , 
    "boost_mode": "replace" 
    } 
    }, 
    "from": 0 
} 

が、私は、このエラー応答を得た

{ 
    "error": { 
     "root_cause": [ 
      { 
       "type": "script_exception", 
       "reason": "failed to run inline script [doc['time_views'].values[doc['time_views'].values.length-1]] using lang [groovy]" 
      } 
     ], 
     "type": "search_phase_execution_exception", 
     "reason": "all shards failed", 
     "phase": "query", 
     "grouped": true, 
     "failed_shards": [ 
      { 
       "shard": 0, 
       "index": "datacollection", 
       "node": "TWeZV3R6Rq-WYQ2YIHjILQ", 
       "reason": { 
        "type": "script_exception", 
        "reason": "failed to run inline script [doc['time_views'].values[doc['time_views'].values.length-1]] using lang [groovy]", 
        "caused_by": { 
         "type": "illegal_argument_exception", 
         "reason": "No field found for [time_views] in mapping with types [message]" 
        } 
       } 
      } 
     ] 
    }, 
    "status": 500 
} 

いくつかのソリューションは、二重引用符を使用して言います"doc ['time_views']"では、コマンドプロンプトツールからクエリを送信したときに問題が発生します。どうしてか分かりません! 私はコマンドプロンプトツールを使用しません。私は「time_views」の最後の項目の「ビュー」を使いたい

"mappings": { 
    "message": { 
     "properties": { 
      "text": { 
       "type": "string" 
      }, 
      "time_views": { 
       "type": "nested", 
        "properties": { 
         "backupTimestamp": { 
         "type": "long" 
         }, 
         "views": { 
         "type": "integer" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

:私は直接

EDIT

これが私のインデックスマッピングであるJavaコードでクエリを作成します。私はあまりにも、スクリプトの下にしようと、それらのそれぞれが異なるエラーをスロー:

"doc['time_views.views'].values[doc['time_views.views'].values.length-1]" 

error: java.util.ArrayList cannot be cast to java.lang.Number 

"doc['time_views.views'].values[doc['time_views.views'].values.size()-1]" 

error: failed to run inline script [doc['time_views.views'].values[doc['time_views.views'].values.size()-1]] using lang [groovy] 

"doc['time_views'].values[doc['time_views'].values.size()-1].views" 

error: failed to run inline script [doc['time_views'].values[doc['time_views'].values.size()-1].views] using lang [groovy]" 
+0

これは 'doc.time_views.values [-1]'の代わりに使えますか?もちろん、 'time_views'フィールドはあなたのマッピングで宣言する必要があります。 – Val

答えて

1

私はelasticsearchとGroovy言語で本当に新しいです。また、私はいくつかのaffort後、私は私のミスや解決策を見つけ、正確にグルーヴィーの構文を知らない、「time_views」は、ネストされたオブジェクトであることを気にしませんでした:

{ 
    "size": 1, 
    "query":{ 
     "function_score": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "match": { 
       "messageText": "car" 
      } 
      } 
     ] 
     } 
    }, 
    "script_score" : { 
     "script" : "doc['time_views.views'].values.get(doc['time_views.views'].values.size()-1)" 
    } 
    , 
    "boost_mode": "replace" 
    } 
    }, 
    "from": 0 
} 

私は

を期待通りにそれが仕事です