ElasticSearch: Inner_hits для вложенного запроса в bool - поддерживается? - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь заставить внутренние хиты работать для вложенных запросов 'AND' (используя 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 голосов
/ 09 октября 2018

Итак, ваш второй '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'}}]}}}}]
    }
  }
}

Но еще лучшим подходом может быть сведение всего этого к одному вложенному запросу с несколькими запросами must. Что-то вроде:

{
  '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'}}
          ]
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...