【问题标题】:How to filter nested object in Elasticsearch 7.5?如何在 Elasticsearch 7.5 中过滤嵌套对象?
【发布时间】:2020-09-15 06:37:49
【问题描述】:

我有一个映射:

      "ntol-2020-05" : {
        "mappings" : {
          {
            "properties": {
              "_createdAt": {
                "type": "date"
              },
              "_logType": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "device": {
                "properties": {
                  ...
                }
              },
              "resp": {
                "type": "nested",
                "properties": {
                  "data": {
                    "type": "nested",
                    "properties": {
                      ...
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

我用三个条件过滤:

  • “_logType”是“爬虫”。
  • “2020-05-23”上的“_createdAt”。
  • “resp”的大小 = 0。

我正在尝试使用查询进行过滤:

{"query":{"bool":{"must":[{"term":{"_logType":{"value":"crawler"}}},{"range":{"_createdAt" :{"gte":"2020-05-23","lte":"2020-05-23","time_zone":"+07:00"}}},{"nested":{"path": "resp","query":{"script":{"script":{"source":"doc['resp'].size() > 0"}}}}}]}},"from": 0,"尺寸":10}

返回错误:

  "type": "script_exception",
  "reason": "runtime error",
  "script_stack": [
    "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:94)",
    "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:41)",
    "doc['resp'].size() > 0",
    "    ^---- HERE"
  ],
  "script": "doc['resp'].size() > 0",
  "lang": "painless",
  "caused_by": {
    "type": "illegal_argument_exception",
    "reason": "No field found for [resp] in mapping with types []"
  }
}

如果我使用脚本 "doc.containsKey('resp') && doc['resp'].size() > 0" 那么它将返回 hits length = 0。

帮帮我。谢谢!

【问题讨论】:

    标签: elasticsearch filter nested date-range


    【解决方案1】:

    您可以使用存在返回“嵌套”字段“resp”具有值的文档。

    {
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "resp",
                "query": {
                  "bool": {
                    "filter": {
                      "exists": {
                        "field": "resp"
                      }
                    }
                  }
                }
              }
            }
          ]
        }
      },
      "from": 0,
      "size": 10
    }
    

    【讨论】:

    • @TaNoBi 很高兴能帮上忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多