我是否需要在Elasticsearch过滤器中优化布尔表达式?

时间:2014-11-06 20:59:11

标签: search elasticsearch search-engine boolean-logic boolean-expression

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

优化我的过滤器以减少参与查询的检查值的数量是否有任何意义? Elasticsearch如何评估"或","和"和" bool"过滤器?

好吧,我可以有一个简单的KNF或DNF表达式。例如。 for(我有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_match bool filters的{​​{1}}支持不幸。

1 个答案:

答案 0 :(得分:2)

使用bool过滤器代替and / or过滤器。如果原子条件是术语过滤器,则会缓存其结果,bool过滤器会使用缓存的位集来快速计算结果,而不像and / or过滤器。由于缓存术语过滤器,如果在查询中重复它们,则可以。给定术语过滤器的结果只计算一次。下次使用相同的过滤器(在同一查询或不同的查询中)时,将使用其缓存的bitset。

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

详细了解here