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

tumayun · 发布于 2015年08月31日 · 最后由 tumayun 回复于 2015年09月01日 · 2221 次阅读
967

示例如下:

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 子句,求解惑!!

共收到 9 条回复
967

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

2511

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

967

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

713

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

8

用 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
967

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

8楼 已删除
8
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"
    }
  }
}
'
967

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册