使用bodybuilder.js生成过滤器动态添加到DSL查询主体

时间:2017-06-24 16:27:57

标签: elasticsearch bodybuilder.js

服务器从前端ajax调用中获取一组查询术语:

req.query.filterTerms=['black', 'white', 'green']

我需要将每个过滤器链接到bodybuilder查询:

var body=bodybuilder()
.query('match', 'searchable', req.query.querytext)
.from(i)
.build();

如何将数组中每个查询项的.filter()方法/函数动态链接到bodybuilder实例?

2 个答案:

答案 0 :(得分:0)

对于有类似问题的任何人,尝试使用bodybuilder实例上的build方法创建的body对象的console.log,手动在实例上插入过滤器方法,并手动输入参数。它将显示结构您可以使用附加到bodybuilder过滤器子句。

答案 1 :(得分:0)

您可以使用reduce:



    const filterTerms = ['red', 'green', 'black'];
    const body = bodybuilder();
    body.query('match', 'searchable', 'foobar');
    const chainedFilter = filterTerms.reduce((filterBody, term) => {
        return filterBody.filter('match', 'term', term)
    }, body);
    console.log(JSON.stringify(body.build(), null, 2))

<script src="https://rawgit.com/danpaz/bodybuilder/master/browser/bodybuilder.min.js"></script>
&#13;
&#13;
&#13;

这相当于将命令链接在一起。