search - 我是否需要在Elasticsearch过滤器中优化 bool 表达式?

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

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

优化我的过滤器以最小化参与查询的检查值的数量是否有意义? Elasticsearch如何评估“或”,“与”和“ bool(boolean) ”过滤器?

好吧,我只需要一个简单的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过滤器不同,它利用缓存的位集快速计算结果。由于术语过滤器已缓存,因此如果您在查询中重复过滤器就可以了。给定项过滤器的结果将仅计算一次。下次使用同一过滤器时(在同一查询或不同查询中),将改为使用其缓存的位集。

因此,我的意思是,查询的第一个版本很好。您无需进一步优化。

进一步了解here

关于search - 我是否需要在Elasticsearch过滤器中优化 bool 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789278/

相关文章:

Android Button Click Event 在实现带有搜索过滤器的 recyclerview 时被多次触发?

java - AWS Elasticsearch : How to apply a policy to an index

c# - ElasticSearch 索引上的自定义属性

java - jirutka/rsql-解析器 : How to define an operator that has no argument?(=空=,=notEmpty=)

html - 使用 HTML5 语义标记搜索结果列表

search - Google如何如此快速地(针对如此多的文档)执行搜索(针对任何给定的查询),并且仍然设法自定义结果?

Android SearchView.onQueryTextSubmit(字符串查询)

sql - SQL 全文搜索中使用通配符 (*) 和单词分组的智能搜索

MySQL:将 "LIKE"搜索转换为全文?

sorting - Elasticsearch分组和按嵌套字段最小值的顺序