按嵌套对象数过滤文档

时间:2019-03-06 00:47:51

标签: elasticsearch

我有一个充满文件的索引,其结构如下:

{
  name: "The sound and the fury",
  tags: [{ name: "confusing", id: "uuid1"}, {name: "sad", id: "uuid-2"}]
}

我想获取所有带有两个以上标签的文档。

我尝试了以下操作:

{
 "query": {
 "bool": {
   "must": [
     {
      "script": {
        "script": "doc['tags'].value.size() == 1"
      }
     }
   ]
  }
 }
}

但是我收到脚本错误:No field found for [tags] in mapping with types。我收到"doc['tags'].size() == 1"

脚本的相同错误

我正在运行elasticsearch 5.6;性能不是问题,因为我将其用于调试和测试目的。

2 个答案:

答案 0 :(得分:2)

如Pari Rajaram所述,您需要更新映射。 但是,我采用了另一种方法,即将tags.id映射到关键字类型(IMHO,ID的更好数据类型)。

这样,您的查询将如下所示:

{
  "query": {
    "bool": {
      "must": {
        "script": {
          "script": "doc['tags.id'].size() == 1"
        }
      }
    }
  }
}

答案 1 :(得分:1)

您需要修改索引映射以启用字段数据。这是一个示例映射。

   put your_index_name/_mapping/doc
    {
       "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "tags": {
            "properties": {
              "id": {
                "type": "text",
                "fielddata":true,
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "name": {
                "type": "text","fielddata":true,
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
}

并使用以下查询

get your_index_name/_search
{ 
"query": {
 "bool": {
   "must": [
     {
      "script": {
        "script": "doc['tags.value'].length > 2"
      }
     }
   ]
  }
 }
}