按嵌套数组的长度过滤

时间:2017-09-16 00:54:41

标签: elasticsearch

这是我的映射:

{"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"
                        }
                   }
              } ]
         }
    }
} }

这给出了与上述相同的错误。

有什么想法吗?

3 个答案:

答案 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子句,并仅获取相关文档。

请参阅existsbool-query

答案 2 :(得分:0)

我最终要做的是在构造期间添加一个字段my_array_length。这样,我可以按该字段的值进行过滤。