Traktuj dziecko jako pole rodzica w elastycznym zapytaniu wyszukiwania

Czytam dokumenty dotyczące elasticsearch i ta [strona] [1] mówi o mapowaniu dziecka na typ nadrzędny przy użyciu_parent.

Jeśli mam dzieci, dzwonięemail dołączony do rodziców o nazwieaccount:

Pola w każdym typie:

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

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

Jak mogę wyszukać wname poleaccount iemail poleemail pod warunkiem, żestate zaccount jestactive?

Czy istnieje sposób na zdobycie wszystkich dzieci (określonego typu lub dowolnego typu), których właścicielem jest rodzic?

Czy podczas indeksowania dokumentu podrzędnego można przekazać obiekt nadrzędny jako właściwość obiektu w danych JSON, a nie jako część ciągu zapytania?

Po wypróbowaniu sugestii imotova wpadłem na to zapytanie:

To jest wykonywane dalejhttp://localhost:9200/myapp/account/_search

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

Problem polega na tym, że powyższe nie daje mi żadnych kont pasujących do e-maila.

Efekt, jaki chcę, jest zasadniczo taki:

Jest jedno pole wyszukiwaniaUżytkownicy zaczynają pisać, a pole wyszukiwania automatycznie się uzupełnia.Zapytanie użytkownika jest sprawdzane pod nazwąaccount lub którykolwiek zemailaddress rodzaj.Jeśliaccounts były dopasowane, po prostu je zwróć. Jeśliemailaddress były zgodne, zwróć swoje konto nadrzędne.Ogranicz do maksymalnie x (powiedzmy 10) kont dla każdego wyszukiwania.

Więc zasadniczo muszę być w stanieOR szukaj między 2 typami i zwróć rodzica dopasowań.

Dane testowe:

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]"
}'

rozwiązanie imotova działało dla mnie. Innym rozwiązaniem, które znalazłem, jest zapytanieaccounts dlastatus = active, a następnie uruchom abool filtrować wynik i używaćhas_child na typie dziecka iprefix naname w środkubool filtr.

questionAnswers(1)

yourAnswerToTheQuestion