ElasticSearch:bool下嵌套查询的Inner_hits - 支持吗?

时间:2018-05-07 13:35:32

标签: elasticsearch

我试图通过内部命中工作来进行嵌套查询(使用bool-must)

基本上,它是必须的两个嵌套查询,但我似乎只是从一个分支获得内部命中,即使它必须是,所以两个分支都必须命中。

支持吗?

[这实际上是Python代码,但它基本上是json]

{
    'size': 10, 
    'query': {
        'bool': {
            'must': [{
                'nested': {
                    'path': 'attributes', 
                    'score_mode': 
                    'avg', 'inner_hits': {},
                     'query': {'bool': {
                             'must': [{'match': {'attributes.ename': 'n1'}},
                                      {'match': {'attributes.sv': 'v1'}}]}}}}, 
                      {
                 'nested': {
                    'path': 'attributes', 
                    'score_mode': 
                    'avg', 
                    'inner_hits': {},
                    'query': {'bool': {
                            'must': [{'match': {'attributes.ename': 'n2'}},
                                     {'match': {'attributes.sv': 'v2'}}]}}}}]
        }
    }
}

1 个答案:

答案 0 :(得分:1)

因此,您的第二个“ inner_hits”将覆盖第一个。您可以给每个人一个“名字”,以确保它们都返回:

{
'size': 10, 
'query': {
    'bool': {
        'must': [{
            'nested': {
                'path': 'attributes', 
                'score_mode': 
                'avg', 'inner_hits': {'name': 'first'},
                 'query': {'bool': {
                         'must': [{'match': {'attributes.ename': 'n1'}},
                                  {'match': {'attributes.sv': 'v1'}}]}}}}, 
                  {
             'nested': {
                'path': 'attributes', 
                'score_mode': 
                'avg', 
                'inner_hits': {'name': 'second'},
                'query': {'bool': {
                        'must': [{'match': {'attributes.ename': 'n2'}},
                                 {'match': {'attributes.sv': 'v2'}}]}}}}]
    }
  }
}

但是更好的方法可能是将整个事情简化为一个带有多个必须查询的嵌套查询。像这样:

{
  'size': 10, 
  'query': {
    'nested': {
      'path': 'attributes', 
      'score_mode': 'avg', 
      'inner_hits': {},
      'query': {
        'bool': {
          'must': [
            {'match': {'attributes.ename': 'n1'}},
            {'match': {'attributes.ename': 'n2'}},
            {'match': {'attributes.sv': 'v1'}},
            {'match': {'attributes.sv': 'v2'}}
          ]
        }
      }
    }
  }
}