ElasticSearch NodeJS - термин агрегации возвращает более одного исходного свойства - PullRequest
0 голосов
/ 12 января 2019

Мне нужно получить уникальный список вещей с некоторыми прикрепленными свойствами. На данный момент это просто возвращает уникальный список имен, но если я хочу включить идентификатор документов агрегатов, что мне делать?

Я использую модульasticsearch npm с методом .search ()

Любая помощь будет принята с благодарностью.

params.body.aggs = {
    uniqueCoolThings: {
      terms: {
        field: 'cool_thing.name.keyword'
      }
    }
}

Это вернет список {key, doc_count}, который я хочу {key, id, doc_count}

Это работает! Спасибо Технократ Сид!

Так что, если мои документы выглядят так

{ cool_things: [{ name, id }, { name, id }] }

Как мне найти идентификатор того, кого я сейчас нахожусь в хите? Например, это рабочий запрос.

params.body.aggs = {
    uniqueCoolThings: {
      terms: {
        field: 'cool_things.name.keyword'
      },
      aggs: {
        value: {
          top_hits: {
            size: 1,
            _source: {
              includes: ['cool_things.id']
            }
          }
        }
      }
    }
  }
}

Все же это вернется

...hits._source: {
    uniqueCoolThings: [
        {
            "id": 500
        },
        {
            "id": 501
        }
     ]
} ...

Мне интересно, как выполнить условие where, чтобы оно возвращало только идентификатор, соответствующий уникальному ключевому слову cool_things.name.key, в котором он находится в данный момент.

1 Ответ

0 голосов
/ 12 января 2019

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

Пример:

Аналогичный запрос агрегации терминов:

"aggs": {
"uniqueCoolThings": {
  "terms": {
    "field": "cool_thing.name.keyword"
  }
 }
}

вернет следующие результаты:

"aggregations": {
"uniqueCoolThings": {
  "doc_count_error_upper_bound": 0,
  "sum_other_doc_count": 0,
  "buckets": [
    {
      "key": "XYZ",
      "doc_count": 2
    },
    {
      "key": "ABC",
      "doc_count": 1
    }
  ]
 }
}

И если вы добавляете агрегацию топ-хитов в качестве субагрегации к вышеуказанному запросу:

"aggs": {
"uniqueCoolThings": {
  "terms": {
    "field": "cool_thing.name.keyword"
  },
  "aggs": {
    "value": {
      "top_hits": {
        "_source": "false"
      }
    }
  }
 }
}

Вы получите следующий результат:

"aggregations": {
"uniqueCoolThings": {
  "doc_count_error_upper_bound": 0,
  "sum_other_doc_count": 0,
  "buckets": [
    {
      "key": "XYZ",
      "doc_count": 2,
      "value": {
        "hits": {
          "total": 2,
          "max_score": 1,
          "hits": [
            {
              "_index": "product",
              "_type": "_doc",
              "_id": "BqGhPGgBOkyOnpPCsRPX",
              "_score": 1,
              "_source": {}
            },
            {
              "_index": "product",
              "_type": "_doc",
              "_id": "BaGhPGgBOkyOnpPCfxOx",
              "_score": 1,
              "_source": {}
            }
          ]
        }
      }
    }
    ....
    .... excluding output for brevity !! 

Обратите внимание, что в приведенном выше результате у вас есть агрегированные документы _id ( value.hits.hits._id ) в вашем списке условий.

Не уверен в синтаксисе, но что-то вроде этого должно работать для вас:

params.body.aggs = {
uniqueCoolThings: {
  terms: {
    field: 'cool_thing.name.keyword'
  }, 
   aggs: {
   value: {
    top_hits: {
      _source: 'false'      
    }
   }
  }
 }
}
...