elasticsearch - 根据不同文档中同一字段的不同值进行过滤

标签 elasticsearch

假设我有以下数据:

{
  "id":"1",
  "name": "John",
  "tag":"x"
},
{
  "id": 2,
  "name":"John",
  "tag":"y"
},
{
  "id": 3,
  "name":"Jane",
  "tag":"x"
}
我想获取同时具有tag =“x” tag =“y”的文档数量(名称唯一)
给定上述数据,查询应返回1,因为只有John有两个文档,其中包含两个必需的标签。
到目前为止,我所能做的是使用OR的查询(因此,tag =“x”或tag =“y”)将返回2。例如:
"aggs": {
  "distict_count": {
    "filter": {
      "terms": {
        "tag": [
          "x",
          "y"
        ]
      }
    },
    "aggs": {
      "agg_cardinality_name": {
        "cardinality": {
          "field": "name"
        }
      }
    }
  }
}
是否可以将其更改为使用而不是

最佳答案

尝试将cardinality放在agg之下,以获取正确的不同计数:

{
  "size": 0,
  "aggs": {
    "distict_count": {
      "filter": {
        "terms": {
          "tag": [
            "x",
            "y"
          ]
        }
      },
      "aggs": {
        "agg_terms": {
          "terms": {
            "field": "name"
          },
          "aggs": {
            "agg_cardinality_name": {
              "cardinality": {
                "field": "name"
              }
            }
          }
        }
      }
    }
  }
}
更正
您可以将cardinality aggs与bucket_selector结合使用,这将排除少于2个唯一标签的存储桶-即x y:
{
  "size": 0,
  "aggs": {
    "distict_count": {
      "filter": {
        "terms": {
          "tag": [
            "x",
            "y"
          ]
        }
      },
      "aggs": {
        "agg_terms": {
          "terms": {
            "field": "name"
          },
          "aggs": {
            "agg_cardinality_tag2": {
              "bucket_selector": {
                "buckets_path": {
                  "unique_tags_count": "unique_tags_count"
                },
                "script": "params.unique_tags_count > 1"
              }
            },
            "unique_tags_count": {
              "cardinality": {
                "field": "tag"
              }
            },
            "unique_names_count": {
              "cardinality": {
                "field": "name"
              }
            }
          }
        }
      }
    }
  }
}

关于elasticsearch - 根据不同文档中同一字段的不同值进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64331146/

相关文章:

elasticsearch - 在Elasticsearch中查询排序的嵌套文档

elasticsearch - 从ES 7.6.1中的ES 6.4.2恢复快照后,为什么无法按ID提取索引文档?

elasticsearch - 使用logstash将日志发送到elasticsearch

ElasticSearch 查询查找两个查询的交集

python - 在 ElasticSearch 中按类型查询更好吗?

elasticsearch 禁用索引创建和删除操作

java - 使用 Java 在 Elasticsearch 中按查询更新

elasticsearch - Kibana 3 - 如何为不同的面板绑定(bind)不同的查询

elasticsearch - 查询嵌套对象时结果奇怪

elasticsearch - 如何正确使用SearchAfter API?