脚本 - 如何根据数组长度/大小创建过滤器?

时间:2014-07-16 15:22:25

标签: elasticsearch mvel

我是ES的新手,但我正在尝试创建一个脚本,可以查询数组以包含一些匹配项,但也可以根据总数组大小进行过滤。

示例数据:

"_source": {
  "id": 5,
  "title": "Chicken & vegetable broth, soda farls & chicken liver toasts ",
  "ingredients": [
    "1 organic or free-range chicken",
    "5 large onions",
    "100g butter, for frying"
  ]
}

以下查询将匹配上述记录但不会返回它,因为它的成分少于5个。

{
"query": {
    "function_score": {
        "query": {
            "terms": {
                "ingredients": ["beef", "bacon"]
            }
        },
        "functions": [{
            "script_score": {
                "script": "ingredients-amount",
                "params": {
                    "my_modifier": 5
                }
            }
        }]
    }
  }
}

我认为ingredients-amount.mvel很简单:

doc['ingredients'].values.length > my_modifier

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

索引数组的长度,这样你就可以做一个简单的range - 过滤器。

如果您使用脚本,则会将整个字段加载到内存中,您可能不想这样做。

答案 1 :(得分:0)

如果你想以脚本的方式做,那么表达式将是:

doc['ingredients'].values.size() > my_modifier

但是使用doc确实不是最好的,性能方面的,所以你可能会更好地将成分列表的长度编入索引,如Alex建议的那样。