has_child и has_parent не возвращают результаты

Я прошел по следующим ссылкам, прежде чем вставлять вопросы

Elasticsearch has_child не возвращает результатов

ElasticSearch 7.3 has_parent/has_child не возвращает никаких хиты

документация ES

Я создал простое сопоставление с text_doc в качестве родителя и flag_doc в качестве дочернего элемента.

{
  "doc_index_ap3" : {
    "mappings" : {
      "properties" : {
        "domain" : {
          "type" : "keyword"
        },
        "email_text" : {
          "type" : "text"
        },
        "id" : {
          "type" : "keyword"
        },
        "my_join_field" : {
          "type" : "join",
          "eager_global_ordinals" : true,
          "relations" : {
            "text_doc" : "flag_doc"
          }
        }
      }
    }
  }
}

Запрос с parent_id работает нормально и возвращает 1 документ, как и ожидалось.

GET doc_index_ap3/_search
{
  "query": {
      "parent_id": {
        "type": "flag_doc",
        "id":"f0d2cb3c-bf4b-11eb-9f67-93a282921115"
      }
  }
}

Но ни один из приведенных ниже запросов не возвращает никаких результатов.

GET doc_index_ap3/_search
{
  "query": {
    "has_parent": {
      "parent_type": "text_doc",
      "query": {
        "match_all": {
        }
      }
    }
  }
}

GET doc_index_ap3/_search
{
  "query": {
    "has_child": {
      "type": "flag_doc",
      "query": {
        "match_all": {}
      }
    }
  }
}

person Astha Gupta    schedule 28.05.2021    source источник


Ответы (1)


Должна быть какая-то проблема в том, как вы проиндексировали родительский и дочерний документы. Обратитесь к этой официальной документации, чтобы узнать больше о отношения родитель-потомок

Добавление рабочего примера с использованием того же сопоставления индексов, что и в вопросе выше.

Родительский документ в контексте text_doc

PUT /index-name/_doc/1

{
  "domain": "ab",
  "email_text": "ab",
  "id": "ab",
  "my_join_field": {
    "name": "text_doc"
  }
}

Дочерний документ

PUT /index-name/_doc/2?routing=1&refresh



 {
  "domain": "cs",
  "email_text": "cs",
  "id": "cs",
  "my_join_field": {
    "name": "flag_doc",
    "parent": "1"
  }
}

Поисковый запрос:

{
  "query": {
    "has_parent": {
      "parent_type": "text_doc",
      "query": {
        "match_all": {
        }
      }
    }
  }
}

Результат поиска:

"hits": [
      {
        "_index": "67731507",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_routing": "1",
        "_source": {
          "domain": "cs",
          "email_text": "cs",
          "id": "cs",
          "my_join_field": {
            "name": "flag_doc",
            "parent": "1"
          }
        }
      }
    ]

Поисковый запрос:

{
  "query": {
    "has_child": {
      "type": "flag_doc",
      "query": {
        "match_all": {}
      }
    }
  }
}

Результат поиска:

"hits": [
      {
        "_index": "67731507",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "domain": "ab",
          "email_text": "ab",
          "id": "ab",
          "my_join_field": {
            "name": "text_doc"
          }
        }
      }
    ]
person ESCoder    schedule 28.05.2021
comment
Привет! Да, я использую скрипт Python для индексации документов. Структура родительского документа: `parent_doc = { id:1, email_text:, 'my_join_field': {name:text_doc}} ` А структура дочернего документа ` child_doc = { id:child_1, domain:abc.com, routing:, 'my_join_field': { name:flag_doc, parent:1 } } ` - person Astha Gupta; 28.05.2021
comment
Я заполняю routing родительским id - person Astha Gupta; 28.05.2021
comment
О, на самом деле, я только что заметил, что в вашем запросе на индексацию дочернего документа вы использовали "parent": "1", который является _id родительского документа, а не id. Позвольте мне обновить мой скрипт и попробовать еще раз - person Astha Gupta; 28.05.2021
comment
это сработало, спасибо! - person Astha Gupta; 29.05.2021