'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
AnneeConstructionLogement < 1960
Y
ResultatGlobalAmiante = true
Z
TypeDiagnosticAmiante = "DAT"
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 次点击
must
和 should
对 AND
和 OR
的这种调换是否相关?这种不匹配逻辑或实现相关吗?
问题来自 .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
}
}
}
]
}
}
]
}
}
}
我在查询索引时对这种行为感到困惑。
无论您是以布尔方式还是集合来解释它(OR
是并集,AND
是交集),我都认为 X AND (Y OR Z) = (X AND Y) OR (X AND Z)
是理所当然的。在下面的例子中,
X
AnneeConstructionLogement < 1960Y
ResultatGlobalAmiante = trueZ
TypeDiagnosticAmiante = "DAT"
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 次点击
must
和 should
对 AND
和 OR
的这种调换是否相关?这种不匹配逻辑或实现相关吗?
问题来自 .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
}
}
}
]
}
}
]
}
}
}