У меня есть некоторые данные, как и в elasticsearch:Возвращаясь пользовательское поле, где значение зависит от запроса в elasticsearch
account (http://localhost:9200/myapp/account/1)
========
name
state
groups //groups is an array containing objects like so {id: 1, starred: true}
//the id is the id of the group type
email (http://localhost:9200/myapp/email/1?parent=1)
========
email
primary //just a boolean to denote whether this email is primary or not
group
========
name
description
email
s дети account
.
на основе imotov's excellent answer, я могу запустить поиск по account.name
и email.email
и вернуть ВСЕ account
сек, где искомый префикс соответствует выше 2 поля:
{
"query": {
"bool": {
"must": [
{
"term": {
"statuses": "active"
}
}
],
"should": [
{
"prefix": {
"name": "a"
}
},
{
"has_child": {
"type": "email",
"query": {
"prefix": {
"email": "a"
}
}
}
}
],
"minimum_number_should_match" : 1
}
}
}
То, что я хотел бы сделать сейчас, чтобы вернуть 2 пользовательские поля для каждого результата:
для каждого результата возвращают поле, называемое
email
, если поиск был подобран наemail
типа (который ребенокaccount
), верните это письмо, в противном случае верните адрес электронной почтыprimary
, связанный с учетной записью, если нет,null
может быть возвращен.Для каждого результата возвратите поле под названием
group
. Значение поля должно содержать имя выделенногоgroup
, идентификатор которого хранится в массивеgroups
. По существу: найдитеgroup.id
, гдеgroup.starred
истинно в каждомaccount.groups
, затем верните соответствиеgroup.name
из базыgroup
по идентификатору, который мы нашли.
Я смотрел на script fields, но я не уверен, что он способен вернуть поля для каждого удара. Я также не уверен, действительно ли это выше в ES.
Может ли кто-нибудь указать некоторые рекомендации относительно того, возможно ли это и как начать работу?