2016-07-26 68 views
0
下面

執行Groovy腳本是我的查詢,我想用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']」中導致從命令提示符工具發送查詢時出現問題。我不知道爲什麼! 我不使用任何命令提示符工具。我在Java代碼中創建查詢直接

EDIT

這是我的索引映射:

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

我想用「time_views」的最後一個項目的「意見」。所以我也嘗試下面的腳本,但他們每個人都拋出不同的錯誤:

"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語言的新手。我不關心這個「time_views」嵌套的對象,也是我不知道究竟常規語法,經過一番affort我發現我的錯誤和解決方案:

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

它的工作如我所料