'must' 在 elasticsearch 查询中 'should' 的分布

Distributivity of 'must' over 'should' in elasticsearch queries

我在查询索引时对这种行为感到困惑。

无论您是以布尔方式还是集合来解释它(OR 是并集,AND 是交集),我都认为 X AND (Y OR Z) = (X AND Y) OR (X AND Z) 是理所当然的。在下面的例子中,

X AND (Y OR Z)

{
 "query": {
    "bool": {
      "must": [
        {
          "range": {
            "AnneeConstructionLogement.keyword": {
              "lt": 1960
            }
          }
        },
        {
          "bool": {
            "should": [
                {"term": {
                    "ResultatGlobalAmiante.keyword": true
                }},
                {"term": {
                    "TypeDiagnosticAmiante.keyword": "DAT"
                }}
              ]
          }
        }
      ]
 }
}

给我 37 次点击

(X AND Y) OR (X AND Z)

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "ResultatGlobalAmiante": true
                }
              },
              {
                "range": {
                  "AnneeConstructionLogement.keyword": {
                    "lt": 1960
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "TypeDiagnosticAmiante.keyword": "DAT"
                }
              },
              {
                "range": {
                  "AnneeConstructionLogement.keyword": {
                    "lt": 1960
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

给了我 102 次点击 这让我感到惊讶,因为 两者在逻辑上是等价的 (或者,至少,我没有看到任何之间的区别)。更令人惊讶的是,我从 _index : ace-logement and AnneeConstructionLogement <= "1960" and ResultatGlobalAmiante: true or _index : ace-logement and AnneeConstructionLogement <= "1960" and TypeDiagnosticAmiante: DAT 开始的 KQL 给了我 134 次点击

mustshouldANDOR 的这种调换是否相关?这种不匹配逻辑或实现相关吗?

问题来自 .keyword 的使用(不知道为什么,但有兴趣知道)。谢谢,@ilvar。我终于得到了相同的点击率

{
 "query": {
    "bool": {
      "must": [
        {
          "range": {
            "AnneeConstructionLogement": {
              "lt": 1960
            }
          }
        },
        {
          "bool": {
            "should": [
                {"term": {
                    "ResultatGlobalAmiante": true
                }},
                {"term": {
                    "TypeDiagnosticAmiante": "DAT"
                }}
              ]
          }
        }
      ]
 }
}

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "ResultatGlobalAmiante": true
                }
              },
              {
                "range": {
                  "AnneeConstructionLogement": {
                    "lt": 1960
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "TypeDiagnosticAmiante": "DAT"
                }
              },
              {
                "range": {
                  "AnneeConstructionLogement": {
                    "lt": 1960
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}