我有一个充满文件的索引,其结构如下:
{
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;性能不是问题,因为我将其用于调试和测试目的。
答案 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"
}
}
]
}
}
}