我在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
是account
的孩子。
根据imotov's excellent answer,我可以在account.name
和email.email
上运行搜索并返回搜索前缀与上述2个字段匹配的所有account
:< / p>
{
"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
的名称,其id存储在groups
数组中。基本上:在每个group.id
中找到group.starred
为真的account.groups
,然后根据我们找到的ID从group.name
类型返回匹配的group
。
我一直在关注script fields,但我不确定它是否能够为每次点击返回字段。我也不确定上述内容是否真的可以在ES中完成。
有人可以提供一些指示,说明这是否可行以及如何开始?
答案 0 :(得分:1)
目前,根本无法访问has_child
或nested
子句中的数据。
唯一的解决方案是获取一些数据,在客户端做出一些决定,然后获得更多数据。
以下是我为实现目标所做的工作:
运行上面的查询并获取数据。
要处理显示匹配电子邮件或主电子邮件(在电子邮件类型上运行):
{"query":
{"bool":{
"should":{
{
"prefix":{
"email" : "the query"
}
},
{
"terms":{
"_parent" : ["list", "of", "account", "ids"]
}
}
}
}
}
}
根据上述查询,我们可以获取与搜索字词匹配的任何电子邮件地址。请务必将上述查询中的字段设置为包含_parent
。
然后,我们可以在PHP以外的语言中使用array_diff()
或类似函数来从上方和原始查询中区分父ID。然后,这应该给我们一个没有电子邮件匹配的帐户列表。然后,只需发送另一个请求即可获取这些帐户的主要电子邮件。
对于组,请发送查询以键入account
和:
_id
约束到帐户ID列表。group.starred
约束为true
。这可以为您提供已加星标的群组列表。要获取更多信息(名称等),请发送查询以键入group
和:
_id
约束到上面的组ID。最后,做一些客户端处理将它们组合在一起,以便程序的下一部分更容易使用。