这是我的映射:
{"field_name": {
"dynamic": "strict",
"properties": {...},
"type": "nested"
}}
我正在尝试仅过滤至少有一个field_name
的文档。
我试过了:
{"query": {
"bool": {
"filter": [ { "script" : {
"script" : {
"inline": "doc['field_name'].length >= 1",
"lang": "painless"
} } ]
}
} }
但是弹性搜索正在向我尖叫No field found for [field_name] in mapping with types [type_name]
。
我还试图将之前的查询包装成nested
,但也没有效果:
{ "nested": {
"path": "field_name",
"query": {
"bool": {
"filter": [ {
"script": {
"script": {
"inline": "doc['field_name'].length >= 1",
"lang": "painless"
}
}
} ]
}
}
} }
这给出了与上述相同的错误。
有什么想法吗?
答案 0 :(得分:1)
如果所有对象都具有相同的字段,则可以使用exist检查对象是否存在,然后使用sum进行计算,然后使用脚本得分选择所需的条件。像下面的代码
{
"query": {
"function_score": {
"query": {
"nested": {
"path": "field_name",
"query": {
"exists": {
"field": "field_name.same_field"
}
},
"score_mode": "sum"
}
},
"functions": [
{
"script_score": {
"script": {
"source": "_score >= 1 ? 1 : 0"
}
}
}
],
"boost_mode": "replace"
}
},
"min_score": 1
}
答案 1 :(得分:0)
简单的方法是为每个字段使用exists
术语:
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{
"exists": {
"field": "field_name.dynamic"
}
},
{
"exists": {
"field": "field_name.properties"
}
},
{
"exists": {
"field": "field_name.type"
}
}
],
"minimum_should_match": 1
}
}
}
}
}
您可以使用should
定义minimum_should_match
子句,并仅获取相关文档。
请参阅exists,bool-query
答案 2 :(得分:0)
我最终要做的是在构造期间添加一个字段my_array_length
。这样,我可以按该字段的值进行过滤。