elasticsearch 重用/缓存脚本字段以使用查询的其他部分,elasticsearch,elastic-stack,elasticsearch,Elastic Stack" /> elasticsearch 重用/缓存脚本字段以使用查询的其他部分,elasticsearch,elastic-stack,elasticsearch,Elastic Stack" />

elasticsearch 重用/缓存脚本字段以使用查询的其他部分

elasticsearch 重用/缓存脚本字段以使用查询的其他部分,elasticsearch,elastic-stack,elasticsearch,Elastic Stack,我正在做一个项目,我们需要显示的距离列表是从一个用户的位置。为了显示距离,当输入中给出lat/lon时,我们使用名为“distance”的脚本字段计算距离 然而,对于相关性搜索,我们希望将最近的列表排名更高,并且在函数得分查询中再次计算距离。这是低效的。我在网上搜索了一下,想找到一个解决办法,但运气不好 有没有办法在查询、筛选或排序的其他部分重用脚本字段? 完整查询: GET /listings/_doc/_search { "_source" : true, "query":

我正在做一个项目,我们需要显示的距离列表是从一个用户的位置。为了显示距离,当输入中给出lat/lon时,我们使用名为“distance”的脚本字段计算距离

然而,对于相关性搜索,我们希望将最近的列表排名更高,并且在函数得分查询中再次计算距离。这是低效的。我在网上搜索了一下,想找到一个解决办法,但运气不好

有没有办法在查询、筛选或排序的其他部分重用脚本字段?

完整查询:

GET /listings/_doc/_search
{
    "_source" : true,
    "query": {
        "function_score": {
            "score_mode": "sum",
            "query": { "match": {
          "source_id": 1
        } },
            "functions": [
              {
                "script_score": {
                  "script": {
                    "params": {
                      "dealer": {"a": 5, "b": 6},
                      "photo": {"a": 4, "b": 5},
                      "location": {"lat": -33.8152, "lon": 151.0012}
                    },
                    "source": "(doc['location'].planeDistanceWithDefault(params.location.lat, params.location.lon, 1000) * 0.001 < 25 ? 200000 : 0) + (doc['is_dealer'].value == 1 ? Math.pow(params.dealer.a, params.dealer.b) : 0) + (doc['hasPhoto'].value == 1 ? Math.pow(params.photo.a, params.photo.b) : 0)"
                  }
                }
              }
            ]
        }
    },
    "script_fields" : {
        "distance" : {
            "script" : {
                "lang": "painless",
                "source": "Math.round((doc['location'].planeDistanceWithDefault(params.lat, params.lon, 0) * 0.001) * 100.0) / 100.0",
                "params" : {
                    "lat"  : -33.8152,
                    "lon" : 151.0012
                }
            }
        }
    }
}
GET/listings/\u doc/\u搜索
{
"来源":对,,
“查询”:{
“功能评分”:{
“得分模式”:“总和”,
“查询”:{“匹配”:{
“来源id”:1
} },
“职能”:[
{
“脚本_分数”:{
“脚本”:{
“参数”:{
“交易商”:{“a”:5,“b”:6},
“照片”:{“a”:4,“b”:5},
“位置”:{“纬度”:-33.8152,“经度”:151.0012}
},
“来源:”(doc['location'].planeDistanceWithDefault(params.location.lat,params.location.lon,1000)*0.001<25?200000:0)+(doc['is_dealer'].value==1?Math.pow(params.dealer.a,params.dealer.b):0)+(doc['hasPhoto'.value==1?Math.pow(params.photo.a,params.photo.b):0)
}
}
}
]
}
},
“脚本_字段”:{
“距离”:{
“脚本”:{
“郎”:“无痛”,
“来源”:“数学圆整((文档['location'].planeDistanceWithDefault(params.lat,params.lon,0)*0.001)*100.0)/100.0”,
“参数”:{
“lat”:-33.8152,
“lon”:151.0012
}
}
}
}
}

您正在使用脚本字段计算距离。无法使用脚本字段对结果进行排序,因为脚本字段是在文档排序后计算的

您可以做的是使用,对结果进行排序:

GET /listings/_doc/_search
{
    "_source" : true,
    "query": {
        /* your query */ 
    },
    "script_fields" : {
        "distance" : {
            "script" : {
                "lang": "painless",
                "source": "Math.round((doc['location'].planeDistanceWithDefault(params.lat, params.lon, 0) * 0.001) * 100.0) / 100.0",
                "params" : {
                    "lat"  : -33.8152,
                    "lon" : 151.0012
                }
            }
        }
    },
    "sort" : [
        {
            "_geo_distance" : {
                "location" : {
                    "lat" : -33.8152,
                    "lon" : 151.0012
                },
                "order" : "asc",
                "unit" : "km",
                "mode" : "min",
                "distance_type" : "sloppy_arc"
            }
        }
    ]
}

另请参阅,它可能会有所帮助。

我们需要使用功能“分数查询”进行自定义评分,这是应用程序的默认评分。我们仅在用户希望首先查看最近的列表时使用距离排序。
GET /listings/_doc/_search
{
    "_source" : true,
    "query": {
        /* your query */ 
    },
    "script_fields" : {
        "distance" : {
            "script" : {
                "lang": "painless",
                "source": "Math.round((doc['location'].planeDistanceWithDefault(params.lat, params.lon, 0) * 0.001) * 100.0) / 100.0",
                "params" : {
                    "lat"  : -33.8152,
                    "lon" : 151.0012
                }
            }
        }
    },
    "sort" : [
        {
            "_geo_distance" : {
                "location" : {
                    "lat" : -33.8152,
                    "lon" : 151.0012
                },
                "order" : "asc",
                "unit" : "km",
                "mode" : "min",
                "distance_type" : "sloppy_arc"
            }
        }
    ]
}