Я читаю документы для 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
ofaccount
равенactive
? -
Есть ли способ получить все дети (определенного типа или любого типа), которыми владеет родитель?
-
При индексировании дочернего документа можно ли передать родительский объект как свойство объекта в данные JSON, а не являться частью строки запроса?
Попробовав предложение imotov, я придумал этот запрос:
Это выполняется на 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
совпадают, верните родительскую учетную запись. - Ограничение на максимум x (скажем, 10) учитывает каждый поиск.
Итак, мне в основном нужно иметь возможность 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": "[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]"
}'
Имотов решение работало для меня. Другим решением, которое я нашел, является запрос account
для status = active
, затем запустите фильтр bool
в результате и используйте has_child
для дочернего типа и prefix
на name
внутри фильтра bool
.