elasticsearch,Field,elasticsearch" /> elasticsearch,Field,elasticsearch" />

Field 返回一个自定义字段,其中值取决于elasticsearch中的查询

Field 返回一个自定义字段,其中值取决于elasticsearch中的查询,field,elasticsearch,Field,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/myap

我在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
电子邮件
s是
帐户
的子帐户

基于,我能够在
account.name
email.email
上运行搜索,并返回所有
account
s,其中搜索的前缀与上述两个字段匹配:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "statuses": "active"
          }
        }
      ],
      "should": [
        {
          "prefix": {
            "name": "a"
          }
        },
        {
          "has_child": {
            "type": "email",
            "query": {
              "prefix": {
                "email": "a"
              }
            }
          }
        }
      ],
      "minimum_number_should_match" : 1
    }
  }
}
我现在要做的是为每个结果返回2个自定义字段:

  • 对于每个结果,返回一个名为
    电子邮件
    的字段,如果搜索与
    电子邮件
    类型(它是
    帐户
    的子项)匹配,则返回该电子邮件,否则返回链接到该帐户的
    电子邮件,如果没有,则可以返回

  • 对于每个结果,返回一个名为
    group
    的字段。该字段的值应包含带星号的
    组的名称,其id存储在
    数组中。本质上:查找
    group.id
    ,其中
    group.starred
    在每个
    帐户.groups
    中为true,然后根据找到的id从
    类型返回匹配的
    组.name

我一直在看,但我不确定它是否能够返回每次命中的字段。我也不确定上述情况是否真的可以在ES中实现


有人能提供一些关于这是否可能以及如何开始的提示吗?

目前,根本无法访问
has_child
嵌套的
子句中的数据

唯一的解决方案是获取一些数据,在客户机上做出一些决策,然后获取更多数据

以下是我为实现这一目标所做的:

  • 运行上面的查询并获取数据

  • 要处理显示匹配电子邮件或主电子邮件(在电子邮件类型上运行):

根据上面的查询,我们可以得到与搜索词匹配的任何电子邮件地址。请记住将上述查询中的字段设置为包含父项

然后,我们可以使用
array_diff()
或PHP以外语言中的类似函数来区分上面的父ID和原始查询。这将给我们一个没有匹配电子邮件的帐户列表。然后发送另一个请求以获取这些帐户的主要电子邮件

对于组,将查询发送到类型
账户
和:

  • \u id
    约束到帐户id列表
  • 将带星号的组约束为
    true
这会给你一张明星组的名单。要获取更多信息(姓名等),请向键入
group
和发送查询:

  • \u id
    约束到上面的组id

最后,进行一些客户端处理,将其放在一起,以便程序的下一部分更容易使用。

目前,根本无法访问
has_child
嵌套的
子句中的数据

唯一的解决方案是获取一些数据,在客户机上做出一些决策,然后获取更多数据

以下是我为实现这一目标所做的:

  • 运行上面的查询并获取数据

  • 要处理显示匹配电子邮件或主电子邮件(在电子邮件类型上运行):

根据上面的查询,我们可以得到与搜索词匹配的任何电子邮件地址。请记住将上述查询中的字段设置为包含父项

然后,我们可以使用
array_diff()
或PHP以外语言中的类似函数来区分上面的父ID和原始查询。这将给我们一个没有匹配电子邮件的帐户列表。然后发送另一个请求以获取这些帐户的主要电子邮件

对于组,将查询发送到类型
账户
和:

  • \u id
    约束到帐户id列表
  • 将带星号的组约束为
    true
这会给你一张明星组的名单。要获取更多信息(姓名等),请向键入
group
和发送查询:

  • \u id
    约束到上面的组id
最后,进行一些客户端处理,将其放在一起,以便程序的下一部分更容易使用

{"query":
    {"bool":{
       "should":{
        {
           "prefix":{
              "email" : "the query"
           }
        },
        {
           "terms":{
              "_parent" : ["list", "of", "account", "ids"]
          }
       }
      }
    }
  }
}