Как отфильтровать вложенный объект в Elasticsearch 7.5? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть сопоставление:

      "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" is "crawler ".
  • " _ createdAt "на" 2020-05-23 ".
  • Размер" 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, "size": 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", то он вернет хиты length = 0.

Помогите мне. Спасибо!

1 Ответ

2 голосов
/ 28 мая 2020

Вы можете использовать exists для возврата документов, в которых «вложенное» поле «resp» имеет значение.

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "resp",
            "query": {
              "bool": {
                "filter": {
                  "exists": {
                    "field": "resp"
                  }
                }
              }
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...