首页 > 解决方案 > Elasticseach 存在对对象类型的查询返回 0 个结果

问题描述

[UPD] Elasticsearch 版本为 5.6

我在中定义了以下映射foo_index

{
    "foo": { 
        "properties": {
            "bar": { 
               "type": "object",
               "dynamic": false
            }
            ...
        } 
    } 
}

中的一些文档foo_index包含bar具有任意 json 数据的属性,而另一些则不包含。所以存储的文档foo_index如下所示:

[
    { bar: { arbitrary: { json: 1 } }, ... },
    { bar: { arbitrary: { json: 2 } }, ... },
    { ... }, // bar property is absent,
    { bar: { arbitrary: { json: 3 } }, ... }
]

当我执行以下查询以仅获取那些包含bar属性的对象时,我得到 0 个结果:

GET foo_index/foo/_search
{
    "query": {
        "exists": {
            "field": "bar"
        }
    }
}

为什么这个查询不起作用?我希望它返回foo包含bar财产的文件。

标签: restapielasticsearchelasticsearch-5

解决方案


您无法查看文档的原因是您dynamic: false在映射中设置了字段。

所以基本上当你这样做时,你是在告诉 elasticsearch不要为该字段创建单独的倒排索引。基本上该字段虽然存在于文档中,但它不是可搜索的字段。因此,没有查询适用于该字段。换句话说,ES 会表现得好像没有这样的字段。

如此链接中所述,当它设置为时,我们有以下内容false

新检测到的字段将被忽略。这些字段不会被索引,因此无法搜索,但仍会出现在返回匹配的 _source 字段中。这些字段不会添加到映射中,必须显式添加新字段。

基本上将您的映射更改为以下内容:

映射:

PUT foo_index
{
  "mappings": {
    "foo":{
      "properties": {
        "bar":{
          "type": "object"
        }
      }
    }
  }
}

如果您在映射中删除该字段,Exists 查询将正常工作

请注意,您需要删除索引,使用映射更改重新创建索引,重新摄取文档,然后尝试查询。


推荐阅读