计算给定结果集上查询的文档数

时间:2017-09-18 05:34:01

标签: elasticsearch

假设我有4个查询:A,B,C,D。 我想要做的是,对于查询A的给定结果集,是计算每个其他查询的结果集的交集计数。

基本上我想要计算A AND BA AND CA AND D,但我不想每次重新计算A。 我使用ES v2.4

示例 - 假设我有一个带有以下映射的索引

{
  "mappings": {
    "doc": {
      "properties": {
        "type": {
          "type": "string"
        },
        "gender": {
          "type": "string"
        },
        "color": {
          "type": "string"
        },
        "material": {
          "type": "string"
        }
      }
    }
  }
}

我的A查询匹配Shirt类型的所有项目,因此:

{
  "query": {
    "match": {
      "type": "Shirt"
    }
  }
}

现在从结果集("所有类型为衬衫&#34的项目;)我想得到的数字也是"蓝",或者是#34;男性" 我可以通过创建单独的查询来实现:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "type": "Shirt"
          }
        },
        {
          "match": {
            "color": "Blue"
          }
        }
      ]
    }
  }
}

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "type": "Shirt"
          }
        },
        {
          "match": {
            "gender": "Male"
          }
        }
      ]
    }
  }
}

但是这会导致在每个查询中搜索type: "Shirt",我真的想避免这种情况。

更新:我找到了我要找的东西 - "过滤"聚合 - 所以我可以构造我的查询:

{
  "query": {
    "match": {
      "type": "Shirt"
    }
  },
  "aggs": {
    "gender_male": {
      "filter": {
        "match": {
          "gender": "Male"
        }
      }
    },
    "color_blue": {
      "filter": {
        "match": {
          "color": "Blue"
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

试试这个。将您的4个查询定义为aggs并立即获取。

GET test/shirts/_search
{
  "query": {
    "bool": {
      "filter": {
        "type": {
          "value": "shirts"
        }
      }
    }
  },
  "aggs": {
    "count_by_color": {
      "terms": {
        "field": "color",
        "size": 100
      }
    },
    "count_by_gender":{
      "terms": {
        "field": "gender",
        "size": 100
      }
    },
    "count_by_material":{
      "terms": {
        "field": "material",
        "size": 100
      }
    },
    "count_by_gender_color":{
      "terms": {
        "field": "gender",
        "size": 100
      },
      "aggs": {
        "color": {
          "terms": {
            "field": "color",
            "size": 100
          }
        }
      }
    }
  }
}