将每个匹配的记录值传递给Elasticearch中的过滤器 [英] Pass each matched record value to filter in Elasticsearch

查看:0
本文介绍了将每个匹配的记录值传递给Elasticearch中的过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于geo_distance查询,我使用常量的距离值。我需要让它充满活力。所以我想将上面匹配的记录半径值传递给距离

代码如下:

let searchRadius = '12KM'
        query: {
            bool: {
                must: {
                    match: {
                        companyName: {
                            query: req.text
                        }
                    }
                },
                filter: {
                    geo_distance: {
                        distance: searchRadius,//here I want to pass doc['radius']
                        location: {
                            lat: parseFloat(req.lat),
                            lon: parseFloat(req.lon)
                        }
                    }
                },
            }
        }

对于每条记录,我都有不同的半径值。我希望传递doc['radius']而不是常量searchRadius值。

我可以命中两个查询,然后迭代值,但这并不是最优的。有人能建议如何将每个记录值传递给地理距离筛选器吗?

推荐答案

我已根据this答案进行解析。

代码如下

query: {
              bool: {
                must: [
                  {
                    match: {
                      companyName: {
                        query: req.text
                      }
                    }
                  },
                  {
                    script: {
                      script: {
                        params: {
                          lat: parseFloat(req.lat),
                          lon: parseFloat(req.lon)
                        },
                        source: "doc['location'].arcDistance(params.lat, params.lon) / 1000 < doc['searchRadius'].value",
                        lang: "painless"
                      }
                    }
                  }
                ]
              }
            },

使用脚本查询,来自更多详细信息:

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-script-query.html

这篇关于将每个匹配的记录值传递给Elasticearch中的过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆