在Elastic Search中将动态值传递给脚本查询

时间:2015-10-05 15:08:59

标签: elasticsearch

我的索引中有两个映射。其中一个以不同货币存储一些金额,其他商店存储当前转换率。每个记录都像这样:

http://localhost:9200/transactions/amount
[{
    _index: "transactions",
    _type: "amount",
    _id: "AVA3fjawwMA2f8TzMTbM",
    _score: 1,
    _source: {
        balance: 1000,
        currency:"usd"
    }
},
{
    _index: "transactions",
    _type: "amount",
    _id: "AVA3flUWwMA2f8TzMTbN",
    _score: 1,
    _source: {
        balance: 2000,
        currency:"inr"
    }
}]

http://localhost:9200/transactions/conversions
{
    _index: "transactions",
    _type: "conversions",
    _id: "rates",
    _score: 1,
    _source: {
        "usd": 1,
        "inr":62.6
    }
}

我想查询amount中的数据,并在单个查询中应用conversions的当前转化率并获得结果。

我尝试使用脚本化查询,并能够根据传递的参数转换数据,如:

GET _search
{
   "query": {
      "match_all": {}
   },
   "script_fields" : {
        "test1" : {
            "script" : "_source.balance * factor",
            "params" : {
                "factor"  : 63.2
            }
        }
    }
}

但是在我的情况下,传递的params将从另一个查询的结果中获取。

我想以共同货币在Kibana中可视化我的数据。 Kibana支持脚本查询。据我所知,Kibana中的所有可视化对应于单个弹性搜索查询,因此我没有选项可以进行多个查询。

我还尝试探索使用https://www.elastic.co/blog/terms-filter-lookup并向结果集中的每个文档添加一些动态字段的可能性。但是,我不认为术语过滤器允许这样做。

1 个答案:

答案 0 :(得分:2)

假设您尝试始终以美元绘制交易,您可以尝试the accepted answer here中描述的方法:

本质上:

  1. 为您的数据父子建模,每个conversions文档都是同一外币中所有子transactions文档的父文档。 (并且conversions具有标准字段名称,例如"conversion_divisor": 62.6
  2. 为所有相关货币转换添加has_parent查询条款。
  3. 使用function_scorescript_score)查询访问每个父级中的外币倍数,并通过将交易金额除以外币{{1}为每笔交易生成_score }}。
  4. 在Kibana中绘制conversion_divisor