假设我有4个查询:A,B,C,D。 我想要做的是,对于查询A的给定结果集,是计算每个其他查询的结果集的交集计数。
基本上我想要计算A AND B
,A AND C
和A 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"
}
}
}
}
}
答案 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
}
}
}
}
}
}