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 zapytanieaccount
s dlastatus = active
, a następnie uruchom abool
filtrować wynik i używaćhas_child
na typie dziecka iprefix
naname
w środkubool
filtr.