搜索引擎 Elasticsearch 如何用 script_fields 计算出来的字段进行排序?

tumayun · August 31, 2015 · Last by mingge replied at November 23, 2017 · 12824 hits

示例如下:

curl -X GET 'http://localhost:9200/users/user/_search?pretty' -d '{
  "script_fields":{
    "distance":{
      "params":{
        "lat":23.1191,
        "lon":113.31
      },
      "script":"doc[\"location\"].distanceInKm(lat, lon)",
      "lang":"groovy"
    }
  }
}
'

返回如下结果:

# 2015-08-31T14:29:46+08:00 [200] (0.005s)
#
# {
#   "took":2,
#   "timed_out":false,
#   "_shards":{
#     "total":5,
#     "successful":5,
#     "failed":0
#   },
#   "hits":{
#     "total":11,
#     "max_score":1.0,
#     "hits":[
#       {
#         "_index":"users",
#         "_type":"user",
#         "_id":"4",
#         "_score":1.0,
#         "fields":{
#           "distance":[
#             12873.486133286819
#           ]
#
# }
#       },
#      ...

请问如何用 fields.distance 进行排序?

在 sort 中,不知道如何取到 distance 的值,所以也就无法写出 sort 子句,求解惑!!

@kungs 都不知道如何在 sort 中拿到 distance 的值

es 有地理位置格式的字段,然后自带提供地理位置排序和距离结果的查询语法。或者再自己写 script 计算。

@as181920 在 script 里如何得到 script_fields 的值?

groovy 的脚本有漏洞,要小心哦

用 function_score:

curl -XGET "http://elastichost:9200/plus-customers/_search?pretty=1" -d'
{ "size": 5,
  "query": {
    "function_score": {
      "script_score": {
        "script": "Math.pow(doc[\"customer_type\"].value, 2)",
        "lang": "groovy"
      }
    }
  }
}'

results:

"_score" : 81.0

@hooopo 我是要用 fields.distance 来排序,怎么写? doc["fields.distance"] 报错啊

8 Floor has deleted
curl -X GET 'http://localhost:9200/users/user/_search?pretty' -d '{
  "query":{
    "function_score":{
      "params":{
        "lat":23.1191,
        "lon":113.31
      },
      "script":"doc[\"location\"].distanceInKm(lat, lon)",
      "lang":"groovy"
    }
  }
}
'

@hooopo 这样不是相当于计算了两次?function_score 要计算 distance,script_fields 也要计算 distance。 我的需求是既要在结果中拿到 distance 的值,又要按照 distance 排序

Reply to tumayun

你好,请问你这个问题怎么解决的?Elasticsearch 如何用 script_fields 计算出来的字段进行排序

You need to Sign in before reply, if you don't have an account, please Sign up first.