有没有一种方法来建立一个“或”与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子句是如何被合并的。让我知道这不是 为你工作。

+0

请检查https://github.com/danpaz/bodybuilder/issues/120 – Chirag

+0

对不起,导致你在错误的方式。我纠正了我的答案。 –