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

时间:2012-08-08 00:29:26

标签: 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/myapp/email/1?parent=1)
========
email
primary //just a boolean to denote whether this email is primary or not

group
========
name
description

emailaccount的孩子。

根据imotov's excellent answer,我可以在account.nameemail.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中完成。

有人可以提供一些指示,说明这是否可行以及如何开始?

1 个答案:

答案 0 :(得分:1)

目前,根本无法访问has_childnested子句中的数据。

唯一的解决方案是获取一些数据,在客户端做出一些决定,然后获得更多数据。

以下是我为实现目标所做的工作:

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

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

    {"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。

最后,做一些客户端处理将它们组合在一起,以便程序的下一部分更容易使用。