Странное поведение inner_hits при работе с has_child

Здравствуйте! Подскажите, пожалуйста, я наткнулся на странное поведение при работе с has_child запросом. Дело в том, что в некоторых запросах у меня оказывается пустым массив inner_hits.hits.

Например, в запросе ниже, прилетает ответ с пустым inner_hits, а если убрать один элемент из should верхнего уровня, inner_hits будет заполнен.

Могли бы вы пояснить такое поведение? Версия ES 6.4.3

{
    "query": {
        "bool": {
            "filter": [
                {
                    "bool": {
                        "should": [
                            {
                                "bool": {
                                    "filter": [
                                        {
                                            "has_child": {
                                                "type": "document",
                                                "inner_hits": {
                                                    "size": 1
                                                },
                                                "query": {
                                                    "bool": {
                                                        "should": [
                                                            {
                                                                "span_near": {
                                                                    "clauses": [
                                                                        {
                                                                            "span_multi": {
                                                                                "match": {
                                                                                    "prefix": {
                                                                                        "fileContent": {
                                                                                            "value": "молок",
                                                                                            "rewrite": "top_terms_4096"
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        },
                                                                        {
                                                                            "span_multi": {
                                                                                "match": {
                                                                                    "prefix": {
                                                                                        "fileContent": {
                                                                                            "value": "натур",
                                                                                            "rewrite": "top_terms_4096"
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    ],
                                                                    "slop": 10,
                                                                    "in_order": false
                                                                }
                                                            }
                                                        ]
                                                    }
                                                }
                                            }
                                        }
                                    ]
                                }
                            },
                            {*****}
                        ]
                    }
                }
            ]
        }
    }
}

Ответ:

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 6,
    "successful": 6,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": null,
    "hits": [
      {
        "_index": "tenders_2019",
        "_type": "_doc",
        "_id": "tender_33058543",
        "_score": null,
        "sort": [
          1547746740000
        ],
        "inner_hits": {
          "document": {
            "hits": {
              "total": 0,
              "max_score": null,
              "hits": []
            }
          }
        }
      },
      {
        "_index": "tenders_2019",
        "_type": "_doc",
        "_id": "tender_33059452",
        "_score": null,
        "sort": [
          1547719620000
        ],
        "inner_hits": {
          "document": {
            "hits": {
              "total": 4,
              "max_score": 634.7183,
              "hits": [
                {
                  "_index": "tenders_2019",
                  "_type": "_doc",
                  "_id": "document_77837537",
                  "_score": 634.7183,
                  "_routing": "tender_33059452",
                  "_source": {
                    "docId": 156399288,
                    "document": {
                      "name": "document",
                      "parent": "tender_33059452"
                    },
                    "name": "b3931cf5-233b-417d-9113-e7be5957b779.docx",
                    "contentLength": 9021,
                    "id": 77837537,
                    "source": "РАЗДЕЛ II СПЕЦИФИКАЦИЯ молочные продукты.docx"
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

А маппинг как выглядит для этих полей?

Вот маппинг полей по которые должны попадать в inner_hits:

"docId": {
          "type": "long"
        },
        "name": {
          "type": "text",
          "index": false
        },
        "source": {
          "type": "text",
          "index": false
        },
        "fileContent": {
          "type": "text",
          "analyzer": "russian",
          "store": true
        },
        "contentLength": {
          "type": "integer"
        }

И как при этом выглядит результат с "_id": "tender_33058543",? И есть ли он там? Я так думаю, что его там не будет, а появляется он из-за того, что он совпадает с частью в {*****} а не с has_child.

Полную версию запросов выложил сюда https://gist.github.com/tushinivan/7c689b18ecc4331a3b66f644fd3e8ac2

Там 2 запроса и 2 результата выполнения.

А вы не могли бы привести полный пример с установками, маппингом и данными, который я мог бы в кибане запустить и посмотреть что там конкретно происходит? Иначе, слишком много предположений надо делать.

Хорошо, сделаю. Это займет некоторое время.

Есть еще одна теория, которую можно быстро проверить. Вы не могли бы попробовать заменить все "bool": { "filter": [ на "bool": { "must": [ и посмотреть не изменит-ли это ситуацию.

Нет, это никак не повлияло на результат..

Создал файл для воспроизведения в кибане. На тестовом индексе проблема воспроизводится. Ссылку на документ отправил личным письмом.

Спасибо. Похоже на баг. Я упростил ваш пример и открыл https://github.com/elastic/elasticsearch/issues/37584

Не уверен, как с этим бороться пока баг не исправили. Надо как-то объединить все has_child в один, но с вашим запросом это нетривиально.

Оказалось, все просто. Надо всего-лишь дать этим inner_hits разные имена: https://gist.github.com/imotov/8ba51253b94296d0ef562a94e12f10cc/revisions

Спасибо!! Это помогло.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.