我有一个满是文档的索引,结构如下:
{
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;性能不是问题,因为我将其用于调试和测试目的。
发布于 2019-03-06 09:21:55
您需要修改索引映射以启用fielddata。这是一个示例映射。
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"
}
}
]
}
}
}发布于 2019-03-07 06:18:31
正如Pari Rajaram所提到的,您需要更新映射。但是,我会采用一种不同的方法,即将tags.id映射到一个关键字类型(IMHO,一种更好的id数据类型)。
这样,您的查询将如下所示:
{
"query": {
"bool": {
"must": {
"script": {
"script": "doc['tags.id'].size() == 1"
}
}
}
}
}https://stackoverflow.com/questions/55013842
复制相似问题