我需要优化Elasticsearch过滤器中的布尔表达式吗



假设我在Elasticsearch过滤器中有一个复杂的布尔表达式(实际上我有这样的条件:给定N个条件,如果其中M个条件求值为true,则结果为true,否则为false)。

优化我的过滤器以最小化参与查询的检查值的数量有什么意义吗?Elasticsearch如何评估"or"、"and"one_answers"bool"过滤器?

我可以有一个简单的KNF或DNF表达式。例如,对于(我有3个条件4匹配):

{
  "or": [
    {
      "and": [
        cond1,
        cond2,
        cond3
      ]
    },
    {
      "and": [
        cond2,
        cond3,
        cond4
      ]
    },
    {
      "and": [
        cond1,
        cond3,
        cond4
      ]
    },
    {
      "and": [
        cond1,
        cond2,
        cond4
      ]
    }
  ]
}

但是,尝试优化它以减少condX评估的数量有什么意义吗?

{
  "or": [
    {
      "and": [
        cond1,
        {
          "or": [
            {
              "and": [
                cond2,
                cond3
              ]
            },
            {
              "and": [
                cond3,
                cond4
              ]
            },
            {
              "and": [
                cond2,
                cond4
              ]
            }
          ]
        },
        {
          "and": [
            cond2,
            cond3,
            cond4
          ]
        }
      ]
    }
  ]
}

比如说,原子条件就是术语过滤器。

(我之所以深入研究这个问题,是因为Elasticsearch中不幸缺少对minimum_should_matchbool filters的支持)。

使用bool过滤器,而不是and/or过滤器。如果原子条件是术语过滤器,则它们的结果被缓存,并且bool过滤器利用缓存的位集来快速计算结果,这与and/or过滤器不同。由于术语过滤器是缓存的,所以如果在查询中重复它们也没关系。给定项过滤器的结果将只计算一次。下次使用相同的过滤器(在同一个查询或不同的查询中)时,将使用其缓存的位集。

所以我想说的是,您的第一个查询版本是好的。您不需要进一步优化它。

点击此处了解更多信息

最新更新