Elasticsearch:如何查询或聚合多值字段计数

时间:2016-05-17 15:56:44

标签: elasticsearch

我必须索引电子邮件,每封邮件都有一个收件人列表,如下所示:

{
"To":[{"name":"John", "email":"john@gmail.com"}, {"name":"Jane", "email":"jane@yahoo.com"}],
"Body": "Blah blah blah"
}

我想在正文中搜索并对仅包含多个收件人的邮件执行聚合。我尝试使用 token_count 数据类型和 value_count 聚合,但似乎都不适用。有没有办法在多值计数器上定义过滤器?

2 个答案:

答案 0 :(得分:1)

实际上,我猜您的To字段是nested字段。如果您想真正将nameemail地址相关联,我不明白为什么不应该这样。否则它只是一个名单列表和一个地址列表,它们之间没有任何关联。

如果您的字段是nested字段,则其映射应为以下字段:

    "To": {
      "type": "nested",
      "include_in_parent": true, 
      "properties": {
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string"
        }
      }
    }

然后查询以搜索特定数量的电子邮件地址:

{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "script": {
          "script": {
            "inline": "doc['To.name'].size() > counter",
            "params": {
              "counter": 1
            }
          }
        }
      }
    }
  }
}

即使该字段不是nested ,上述查询仍适用。

答案 1 :(得分:0)

也许Script Query可以为您效劳:

"bool" : {
    "must" : {
        // query on body
        ...
    },
    "filter" : {
        "script" : {
            "script" : {
                "inline" : "doc['To.name'].size() > param1"
                "params" : {
                    "param1" : 1
                }
            }
        }
    }
}

但不要忘记启用脚本:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html#enable-dynamic-scripting