有没有办法建立一个"或"使用Bodybuilder ElasticSearch的has_child

时间:2017-02-23 14:51:01

标签: 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"
                            }
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    }
}

1 个答案:

答案 0 :(得分:2)

不,不幸的是。

实际上,是的。我错了。 OP在Bodybuilder的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条款是如何合并的。让我知道这不是   为你工作。