我的映射中有一个嵌套的类型字段。当我在嵌套字段上使用 Term 搜索查询时,Elasticsearch不会返回任何结果,而当我将 Term 更改为 Match 查询时,它工作正常且Elasticsearch返回预期结果
这是我的映射,假设我的类型映射中只有一个嵌套字段
{
"homing.estatefiles": {
"mappings": {
"estatefile": {
"properties": {
"DynamicFields": {
"type": "nested",
"properties": {
"Name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"ValueBool": {
"type": "boolean"
},
"ValueDateTime": {
"type": "date"
},
"ValueInt": {
"type": "long"
}
}
}
}
}
}
}
}
这是我的学期查询(不返回任何结果)
{
"from": 50,
"size": 50,
"query": {
"bool": {
"filter": [
{
"nested": {
"query": {
"bool": {
"must": [
{
"term": {
"DynamicFields.Name":{"value":"HasParking"}
}
},
{
"term": {
"DynamicFields.ValueBool": {
"value": true
}
}
}
]
}
},
"path": "DynamicFields"
}
}
]
}
}
}
这是我的查询,它返回预期结果(通过将术语查询更改为匹配查询)
{
"from": 50,
"size": 50,
"query": {
"bool": {
"filter": [
{
"nested": {
"query": {
"bool": {
"must": [
{
"match": {
"DynamicFields.Name":"HasParking"
}
},
{
"term": {
"DynamicFields.ValueBool": {
"value": true
}
}
}
]
}
},
"path": "DynamicFields"
}
}
]
}
}
}
答案 0 :(得分:1)
之所以发生这种情况,是因为大写字母带有弹性的分析器。
使用term
时,松紧带正在寻找您给出的确切值。
直到现在听起来还不错,但是在尝试匹配该术语之前,您给的值要经过一个弹性分析器来操纵您的值。
例如,在您的情况下,还将HasParking
更改为hasparking
。
然后它将尝试匹配它,当然会失败。他们在documentation in the "Why doesn’t the term query match my document"部分有很好的解释。当您使用match
查询时,此分析器未在值上激活,这就是为什么要获得结果的原因。