对嵌套字段的术语查询在Elasticsearch中不返回结果

时间:2018-10-10 07:40:30

标签: elasticsearch elasticsearch-query

我的映射中有一个嵌套的类型字段。当我在嵌套字段上使用 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"
      }
     }
    ]
   }
 }
}

1 个答案:

答案 0 :(得分:1)

之所以发生这种情况,是因为大写字母带有弹性的分析器。

使用term时,松紧带正在寻找您给出的确切值。 直到现在听起来还不错,但是在尝试匹配该术语之前,您给的值要经过一个弹性分析器来操纵您的值。 例如,在您的情况下,还将HasParking更改为hasparking

然后它将尝试匹配它,当然会失败。他们在documentation in the "Why doesn’t the term query match my document"部分有很好的解释。当您使用match查询时,此分析器未在值上激活,这就是为什么要获得结果的原因。