ElasticSearch中BoolQuery的“过滤器”的目的是什么?

时间:2019-06-28 05:00:59

标签: java elasticsearch

我阅读了BoolQuery的文档,并据此达到目的

  

过滤器

     

子句(查询)必须出现在匹配的文档中。但是不像   必须忽略查询的分数。过滤子句是   在过滤器上下文中执行,这意味着计分被忽略,并且   子句考虑用于缓存。

也来自BoolQueryBuilder类:

   /**
     * Adds a query that <b>must</b> appear in the matching documents but will
     * not contribute to scoring. No {@code null} value allowed.
     */
    public BoolQueryBuilder filter(QueryBuilder queryBuilder) {
        if (queryBuilder == null) {
            throw new IllegalArgumentException("inner bool query clause cannot be null");
        }
        filterClauses.add(queryBuilder);
        return this;
    }

但是,我无法理解。我什么时候应该使用过滤器vs(应该还是必须)

这是我正在研究的示例:

  

我要根据以下假设过滤掉一些记录:

     

全部获取

     

1)记录deleted=0isPrivate=true

的位置      

AND

     

2)记录(isPrivate=false or [isPrivate=true and createdBy=loggedInUser])

以下是两个给出相同结果的查询,我想知道filter查询表示什么

不带过滤器的结果仅使用must和should子句。

"query": {
    "bool": {
      "must": [
        {
          "term": {
            "deleted": {
              "value": "0",
              "boost": 1
            }
          }
        },
        {
          "match": {
            "isPrivate": {
              "query": true
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "isPrivate": {
                    "value": "false",
                    "boost": 1
                  }
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "createdBy": {
                          "value": "1742991596",
                          "boost": 1
                        }
                      }
                    },
                    {
                      "term": {
                        "isPrivate": {
                          "value": "true",
                          "boost": 1
                        }
                      }
                    }
                  ],
                  "adjust_pure_negative": true,
                  "boost": 1
                }
              }
            ]
          }
        }
      ]
    }
  },

使用过滤器查询

"query": {
    "bool": {
      "adjust_pure_negative": true,
      "boost": 1,
      "filter": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "deleted": {
                    "value": "0",
                    "boost": 1
                  }
                }
              },
              {
                "match": {
                  "isPrivate": {
                    "query": true
                  }
                }
              }
            ],
            "should": [
              {
                "term": {
                  "isPrivate": {
                    "value": "false",
                    "boost": 1
                  }
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "term": {
                        "createdBy": {
                          "value": "1742991596",
                          "boost": 1
                        }
                      }
                    },
                    {
                      "term": {
                        "isPrivate": {
                          "value": "true",
                          "boost": 1
                        }
                      }
                    }
                  ],
                  "adjust_pure_negative": true,
                  "boost": 1
                }
              }
            ],
            "adjust_pure_negative": true,
            "boost": 1
          }
        }
      ]
    }
  }

1 个答案:

答案 0 :(得分:1)

在您的情况下,您应该绝对使用bool/filter,因为您没有任何有助于得分的约束,所有约束都是是/否匹配,并且通过使用filter您可以从过滤器中受益缓存(使用时不需缓存)

因此绝对可以使用filter选项,但要稍加修改(您根本不需要,布尔逻辑没有正确地转换为bool查询):

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "filter": [
        {
          "term": {
            "deleted": {
              "value": "0",
              "boost": 1
            }
          }
        },
        {
          "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "term": {
                  "isPrivate": {
                    "value": "false",
                    "boost": 1
                  }
                }
              },
              {
                "bool": {
                  "filter": [
                    {
                      "term": {
                        "createdBy": {
                          "value": "1742991596",
                          "boost": 1
                        }
                      }
                    },
                    {
                      "term": {
                        "isPrivate": {
                          "value": "true",
                          "boost": 1
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

总而言之:

  • should = OR条件
  • must = AND条件(需要评分时)
  • filter = AND条件(当不需要评分和/或希望从过滤器缓存中受益时)
  • 奖金:must_not =不满足