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 é consultaraccount
s parastatus = active
, em seguida, execute umbool
filtrar o resultado e usarhas_child
no tipo de criança eprefix
emname
dentro debool
filtro.