1

我在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

emails 是 的孩子account

基于imotov 的优秀答案,我能够运行搜索account.nameemail.email返回account搜索前缀与上述 2 个字段匹配的 ALL:

{
  "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数组中的星号的名称。本质上:在 each 中查找 true 的group.id位置,然后根据我们找到的 id从类型返回匹配项。group.starredaccount.groupsgroup.namegroup

我一直在查看脚本字段,但我不确定它是否能够为每次点击返回字段。我也不确定上述是否真的可以在 ES 中完成。

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

4

1 回答 1

1

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

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

这是我为实现它所做的事情:

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

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

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

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

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

对于组,发送查询以键入account并:

  • 限制_id为帐户 ID 列表。
  • 约束group.starredtrue

这应该会为您提供已加星标的组列表。要获取更多信息(名称等),请发送查询以键入group并:

  • 限制_id到上面的组 ID。

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

于 2012-08-10T11:42:51.847 回答