elasticsearch必须与MUST_NOT(逆)差异

时间:2017-09-18 16:53:15

标签: elasticsearch querydsl

我有一个相当大的filter汇总结果,这些结果会加载到下拉列表中以提供animal --> ["dog", "cat", "rabbit", ........ , "squirrel"]功能。

让我们说,我的下拉名单中有超过4000只动物。我的另一个下拉列表有4种动物颜色。

示例,

color --> ["black", "white", "grey", "brown"]

elasticseatch

{"animal": "dog", "color": "white"}, .... {"animal": "cat", "color": "white"}, .... {"animal": "rabbit", "color": "grey"}, .... {"animal": "squirrel", "color": "brown"} 中的文档如下所示:

checkboxes

默认情况下,我的下拉列表中的所有checked都是animal_features,Elasticsearch会返回其中包含的所有结果。现在,我希望根据所选的动物颜色看到另一个字段checked的基数结果。如果我的下拉列表中没有{ "query": { "bool": { "must": [ {"match": { "color": "black"}} ] } }, "aggs": { "unique_animal_features": { "cardinality": { "field": "animal_features", "precision_threshold" : 40000 } } } } ,我可以轻松完成这个操作,我可以运行以下查询。当color = black时,查询将返回预期的基数结果。

checked

但是,我默认拥有所有动物和颜色must_not。假设当color = black时我仍然想要基数结果。所以在我的情况下,我需要继续并取消选中除黑色之外的所有颜色。所以我继续前进,取消选中白色,灰色和棕色。

从下面的第二个查询中,我期待Elasticsearch会返回相同的结果,因为我使用{ "query": { "bool": { "must_not": [ { "match": { "color": "white" } }, { "match": { "color": "grey" } }, { "match": { "color": "brown" } } ] } }, "aggs": { "unique_animal_features": { "cardinality": { "field": "animal_features", "precision_threshold" : 40000 } } } ] } 查询从结果中排除了其他非黑色的颜色。

{{1}}

然而,第二个查询返回了很大程度上不准确的基数结果。我需要使用第二个查询,但需要像第一个查询一样的结果,如何优化我的第二个查询才能做到这一点?

注意:第一个和第二个查询之间的唯一区别是,在第一个查询的情况下,除了单个颜色之外没有选择任何内容。但是,在第二个查询的情况下,默认情况下会选择包括动物和颜色在内的所有内容,直到用户开始取消选中颜色。

1 个答案:

答案 0 :(得分:0)

我能够找出问题所在。就我而言,elasticsearch中有null个值,其中第二个查询返回基于所选animal的基数计数和包含null的记录。

我将"null_value": "_null_"添加到我的索引模板中,现在使用以下查询获得正确的值。

{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "color": "_null_"
          }
        },
        {
          "match": {
            "color": "white"
          }
        },
        {
          "match": {
            "color": "grey"
          }
        },
        {
          "match": {
            "color": "brown"
          }
        }
      ]
    }
  },
  "aggs": {
    "unique_animal_features": {
      "cardinality": {
        "field": "animal_features",
        "precision_threshold" : 40000
      }
    }
  }
  ]
}