Tratar filho como campo de pai em consulta de pesquisa elástica

Eu estou lendo os documentos para elasticsearch e isso [page] [1] fala sobre o mapeamento de um filho para um tipo pai usando_parent.

Se eu tiver filhos chamadosemail ligado aos pais chamadoaccount:

Campos em cada tipo:

account (http://localhost:9200/myapp/account/1)
========
id
name
some_other_info
state

email (http://localhost:9200/myapp/email/1?parent=1)
========
id
email

Como posso pesquisar noname Campo deaccount e aemail Campo deemail desde que ostate doaccount éactive?

Existe uma maneira de obter todos os filhos (de um determinado tipo ou de qualquer tipo) que um pai possui?

Ao indexar um documento filho, é possível passar o pai como uma propriedade de objeto nos dados JSON, em vez de fazer parte da cadeia de consulta?

Depois de tentar a sugestão de imotov, eu fiz esta consulta:

Isso é executado emhttp://localhost:9200/myapp/account/_search

{
  "query": {
    "bool": {
      "must": [
        {
          "prefix": {
            "name": "a"
          }
        },
        {
          "term": {
            "statuses": "active"
          }
        }
      ],
      "should": [
        {
          "has_child": {
            "type": "emailaddress",
            "query": {
              "prefix": {
                "email": "a"
              }
            }
          }
        }
      ]
    }
  }
}

O problema é que o acima não me dá nenhuma conta onde o email corresponda.

O efeito que eu quero é essencialmente isso:

Existe uma caixa de pesquisaOs usuários começam a digitar e o preenchimento automático da caixa de pesquisa.A consulta do usuário é verificada em relação ao nome doaccount ou qualquer um dosemailaddress tipo.E seaccounts foram correspondidos, basta devolvê-los. E seemailaddress foram match, retornar sua conta pai.Limite para um máximo de x (digamos 10) contas para cada pesquisa.

Então, basicamente eu preciso ser capaz deOR a pesquisa entre dois tipos e retorna o tipo pai de correspondências.

Dados de teste:

curl -XPUT http://localhost:9200/test/account/1 -d '{
    "name": "John Smith",
    "statuses": "active"
}'

curl -XPUT http://localhost:9200/test/account/2 -d '{
    "name": "Peter Smith",
    "statuses": "active"
}'

curl -XPUT http://localhost:9200/test/account/3 -d '{
    "name": "Andy Smith",
    "statuses": "active"
}'

//Set up mapping for parent/child relationship

curl -XPUT 'http://localhost:9200/test/email/_mapping' -d '{
    "emails" : {
        "_parent" : {"type" : "account"}
    }
}'

curl -XPUT http://localhost:9200/test/email/1?parent=1 -d '{
    "email": "[email protected]"
}'

curl -XPUT http://localhost:9200/test/email/2?parent=1 -d '{
    "email": "[email protected]"
}'

curl -XPUT http://localhost:9200/test/email/3?parent=1 -d '{
    "email": "[email protected]"
}'

curl -XPUT http://localhost:9200/test/email/4?parent=2 -d '{
    "email": "[email protected]"
}'

curl -XPUT http://localhost:9200/test/email/5?parent=3 -d '{
    "email": "[email protected]"
}'

curl -XPUT http://localhost:9200/test/email/6?parent=3 -d '{
    "email": "[email protected]"
}'

A solução de imotov funcionou para mim. Outra solução que encontrei é consultaraccounts parastatus = active, em seguida, execute umbool filtrar o resultado e usarhas_child no tipo de criança eprefix emname dentro debool filtro.

questionAnswers(1)

yourAnswerToTheQuestion