упругий поиск совокупности строк - PullRequest
2 голосов
/ 08 апреля 2020

Мне нужен запрос агрегации, чтобы получить корзину со всеми моими папками root. Все документы в моемasticsearch имеют поле с именем path, в котором я храню массив с путями, в которых находится документ (например, path = [1.3., 1.2.4, 5., 11]).

Если я используйте обычное агрегирование терминов

"terms": {
    "field": "path.keyword"
}

Я, к сожалению, получаю все уникальные пути:

"buckets" : [
    {
      "key" : "1.3."
      "doc_count" : 6
    },
    {
      "key" : "11."
      "doc_count" : 3
    },
    {
      "key" : "5."
      "doc_count" : 3
    },
    {
      "key" : "1.2.4."
      "doc_count" : 1
    }
]

Я пытался решить его с помощью безболезненного сценария

"terms": {
    "script": "doc['path.keyword'].value.substring(0, doc['path.keyword'].value.indexOf('.')  )"
}

но тогда я получаю только последние элементы моего массива пути

"buckets" : [
    {
      "key" : "1",
      "doc_count" : 7
    },
    {
      "key" : "11",
      "doc_count" : 3
    }
]

как мне получить только папки root?

1 Ответ

3 голосов
/ 08 апреля 2020

Использование doc ["field"]. Value даст единственную строку из всех значений в поле. В скрипте вам нужно вернуть массив значений со значением root, т.е. перебрать все элементы поля и вернуть массив подстроки.

Пример данных:

"hits" : [
      {
        "_index" : "index84",
        "_type" : "_doc",
        "_id" : "yihhWnEBHtQEPt4DqWLz",
        "_score" : 1.0,
        "_source" : {
          "path" : [
            "1.1.1",
            "1.2",
            "2.1.1",
            "12.11"
          ]
        }
      }
    ]

Запрос

{
  "aggs": {
    "root_path": {
      "terms": {
        "script": {
          "source": "def firstIndex=0;def path=[]; for(int i=0;i<doc['path.keyword'].length;i++){firstIndex=doc['path.keyword'][i].indexOf('.'); path.add(doc['path.keyword'][i].substring(0,firstIndex))} return path;"
        }
      }
    }
  }
}

Результат:

"aggregations" : {
    "root_path" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "1",
          "doc_count" : 1
        },
        {
          "key" : "12",
          "doc_count" : 1
        },
        {
          "key" : "2",
          "doc_count" : 1
        }
      ]
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...