Фильтрация документов по неизвестному значению поля

#elasticsearch #elasticsearch-painless #elasticsearch-scripting

#elasticsearch #elasticsearch- безболезненный #elasticsearch-скриптинг

Вопрос:

Я пытаюсь создать запрос для фильтрации моих документов по одному (может быть любому) значению из поля (в моем случае «host.name «). Дело в том, что я ранее не знал уникальных значений этого поля. Мне нужно найти их и выбрать один из них для использования в запросе.

Я попробовал приведенный ниже запрос, используя безболезненный сценарий, но мне не удалось достичь цели.

 {
      "sort" : [{"@timestamp": "desc"}, {"host.name": "asc"}],
      "query": {
        "bool": {
          "filter": {
            "script": {
              "script": {
                "source": """
                  String k = doc['host.name'][0];
                  return doc['host.name'].value == k;
                """,
                "lang": "painless"
              }
            }
          }
        }
      }
 

Я буду признателен, если кто-нибудь поможет мне улучшить эту идею, предложив мне новую.

Ответ №1:

TL; DR вы не можете.

Контекст запроса скрипта работает с одним документом за раз, поэтому у вас не будет доступа к значениям полей других документов. Вы можете либо использовать scripted_metric агрегацию, которая позволяет выполнять итерации по всем документам, но это просто агрегация, а не запрос.

Я бы предложил сначала запустить простой terms agg, чтобы выяснить, с какими значениями вы работаете, а затем соответствующим образом строить свои запросы.