在bool查询中匹配条件的记录数

时间:2018-06-04 05:37:28

标签: node.js elasticsearch

我有一个ES查询(condition1或condition2或condition3 ....)和其他条件。

括号内的每个条件都是“必须”。搜索与给定名称,位置和产品匹配的所有文档的子句。

GET index/type/_count
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name1"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product1"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location1"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name2"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product2"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location2"
                  }
                }
              }
            ]
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "some other condition"
          }
        }
      ],
      "must": [
        {
          "term": {
            "somefield": "value"
          }
        },
        {
          "range": {
            "time": {
              "gte": "now-6M"
            }
          }
        }
      ]
    }
  }
}

是否可以获得与每个“必须”相匹配的记录数。 '内的条款应该'使用一个查询而不是整体计数?

1 个答案:

答案 0 :(得分:0)

是的,您可以使用聚合来完成,特别是filter聚合。查询可能如下所示:

POST index/type/_search
{
  "query": {
    "bool": {
      "should": [
        "<clause1>",
        "<clause2>"
      ],
      "must_not": [
        "<mustNotClause3>"
      ],
      "must": [
        "<mustClause4>"
      ]
    }
  },
  "aggs": {
    "clause1": {
      "filter": "<clause1>"
    },
    "clause2": {
      "filter": "<clause2>"
    }
  }
}

请注意,我们在此处使用_search API。如果您不需要搜索结果,则可以设置size: 0,这将仅返回总计数和聚合。

在您的情况下,查询将完全是这样的:

POST index/type/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name1"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product1"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location1"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name2"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product2"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location2"
                  }
                }
              }
            ]
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "some other condition"
          }
        }
      ],
      "must": [
        {
          "term": {
            "somefield": "value"
          }
        },
        {
          "range": {
            "time": {
              "gte": "now-6M"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "clause1": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "NAME": {
                  "value": "name1"
                }
              }
            },
            {
              "term": {
                "PRODUCT": {
                  "value": "product1"
                }
              }
            },
            {
              "term": {
                "LOCATION": {
                  "value": "location1"
                }
              }
            }
          ]
        }
      }
    },
    "clause2": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "NAME": {
                  "value": "name2"
                }
              }
            },
            {
              "term": {
                "PRODUCT": {
                  "value": "product2"
                }
              }
            },
            {
              "term": {
                "LOCATION": {
                  "value": "location2"
                }
              }
            }
          ]
        }
      }
    }
  }
}

请注意,汇总clause1clause2的总和可能会大于总计数。

希望有所帮助!