有没有一种方法来建立一个“或”与has_child使用Bodybuilder ElasticSearch
问题描述:
{ "query": { "bool": { "should": [ { "has_child": { "inner_hits":{}, "type": "emp", "query": { "match": { "name": "xyz" } } } }, { "bool": { "must": [ { "match" : { "name" : "xyz" } }, { "match" : { "_type" : "emps" } } ], "must_not": [ { "has_child": { "type": "emp", "query": { "exists": { "field": "name" } } } } ] } } ] } } }
答
不幸的是,没有。
其实,是的。我错了。 OP对健美的github上发布his question并取得了以下答案:
这是一个有点古怪,但是这是我会写:
var inner = bodybuilder()
.query('match', 'name', 'xyz')
.query('match', '_type', 'emps')
.notQuery('has_child', {type: 'emp'}, (q) => {
return q.query('exists', 'field', 'name')
})
.build()
bodybuilder()
.orQuery('bool', inner.query.bool)
.orQuery('has_child', {inner_hits: {}, type: 'emp'}, (q) => {
return q.query('match', 'name', 'xyz')
})
.build()
有得 注意: orQuerys的顺序在这里很重要,如果它们被切换,它不起作用 ,这是不理想的。我认为这是因为 bool子句是如何被合并的。让我知道这不是 为你工作。
请检查https://github.com/danpaz/bodybuilder/issues/120 – Chirag
对不起,导致你在错误的方式。我纠正了我的答案。 –