Я читаю документы для elasticsearch, и эта [страница] [1] рассказывает о сопоставлении дочернего элемента с родительским типом с помощью _parent
.
Если у меня есть дети по имени email
, привязанные к родителям по имениaccount
:
Поля каждого типа:
account (http://localhost:9200/myapp/account/1)
========
id
name
some_other_info
state
email (http://localhost:9200/myapp/email/1?parent=1)
========
id
email
Как я могу искать в поле name
в account
и в поле email
в email
при условии, что state
в account
равно active
?
Есть ли способ получить всех дочерних элементов (определенного типа или любого типа ), которыми владеет родитель?
При индексировании дочернего документа можно ли передать родительский объект как свойство объекта в данных JSON, а не как часть строки запроса?
Попробовав предложение Имотова, я придумал этот запрос:
Это выполняется наhttp://localhost:9200/myapp/account/_search
{
"query": {
"bool": {
"must": [
{
"prefix": {
"name": "a"
}
},
{
"term": {
"statuses": "active"
}
}
],
"should": [
{
"has_child": {
"type": "emailaddress",
"query": {
"prefix": {
"email": "a"
}
}
}
}
]
}
}
}
Проблема в том, что вышеуказанное не дает мне никаких учетных записей, где электронная почта совпадает.
Эффект, которого я хочу, по сути:
account
или любому типу emailaddress
.accounts
совпали, просто верните их. Если emailaddress
соответствует, вернуть его родительскую учетную запись.Итак, мне в основном нужно иметь возможность OR
искать между двумя типами и возвращать родительский тип совпадений.
Данные испытаний:
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": "john@smith.com"
}'
curl -XPUT http://localhost:9200/test/email/2?parent=1 -d '{
"email": "admin@mycompany.com"
}'
curl -XPUT http://localhost:9200/test/email/3?parent=1 -d '{
"email": "abcd@efg.com"
}'
curl -XPUT http://localhost:9200/test/email/4?parent=2 -d '{
"email": "peter@peter.com"
}'
curl -XPUT http://localhost:9200/test/email/5?parent=3 -d '{
"email": "andy@yahoo.com"
}'
curl -XPUT http://localhost:9200/test/email/6?parent=3 -d '{
"email": "support@mycompany.com"
}'
решение Имотова сработало для меня. Другое решение, которое я нашел, состоит в том, чтобы запросить account
s для status = active
, затем запустить фильтр bool
для результата и использовать has_child
для дочернего типа и prefix
для name
внутри фильтра bool
..