在Elasticsearch的内联脚本中使用参数

时间:2017-02-14 22:40:33

标签: python-2.7 elasticsearch

我尝试使用带有参数的Elasticsearch 5.1内联脚本,但是params标记似乎不起作用:

以下查询无法使用参数:

{
  "query": {
  "match_all":{}
  },
  "script_fields": {
  "distance": {
    "script":{
    "lang":"painless",
     "inline":"doc['address_details.location.point'].arcDistance(-38.376465,144.829099)"
      }
    }
  }
}

以下查询无效,因为我使用params:

    {  
       "query":{  
          "match_all":{  

          }
       },
       "script_fields":{  
          "distance":{  
             "script":{  
                "lang":"painless",
                "inline":"doc['address_details.location.point'].arcDistance(latitude,longitude)",
                "params":{  
                   "latitude":-38.376465,
                   "longitude":144.829099
                }
             }
          }
       }
    }

错误消息是:TransportError(500,u' search_phase_execution_exception',u'编译错误')

我通过python elasticsearch客户端执行此查询,客户端版本I使用的是: elasticsearch&GT = 5.0.0,< 6.0.0

我执行查询的方式是:

conn=Elasticsearch(['http://username:password@localhost:9200/'])
conn.search(index='index_name',doc_type='type',body=query)

2 个答案:

答案 0 :(得分:0)

当我看到您的第二个查询无效时,您错误地params,您有.arcDistance(latitude,longitude),"params"来修复它只是在逗号之前添加",所以.arcDistance(latitude,longitude)","params"

应该是这样的:

{  
   "query":{  
      "match_all":{  

      }
   },
   "script_fields":{  
      "distance":{  
         "script":{  
            "lang":"painless",
            "inline":"doc['address_details.location.point'].arcDistance(latitude,longitude)",
            "params":{  
               "latitude":-38.376465,
               "longitude":144.829099
            }
         }
      }
   }
}

格式干净的代码将解决大多数此类错误。

答案 1 :(得分:0)

事实证明Elasticsearch文档有误,你应该添加“params”。在变量前面,以便访问它的值。

这是正确的查询:

{  
   "query":{  
      "match_all":{  

      }
   },
   "script_fields":{  
      "distance":{  
         "script":{  
            "lang":"painless",
            "inline":"doc['address_details.location.point'].arcDistance(params.latitude,params.longitude)",
            "params":{  
               "latitude":-38.376465,
               "longitude":144.829099
            }
         }
      }
   }
}