在elasticsearch

时间:2016-07-26 14:35:04

标签: elasticsearch groovy

下面是我的查询,我想使用function_score功能更改分数计算:

{
  "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代码中创建查询

  

修改

这是我的索引映射:

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

1 个答案:

答案 0 :(得分:1)

我在弹性搜索和常规语言方面真的很新。我并不关心那个" time_views"是嵌套的对象,我也完全不知道groovy的语法,经过一番了解我发现了我的错误和解决方案:

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

按预期工作