Агрегирование эластичного поиска с несколькими полями - PullRequest
0 голосов
/ 16 января 2019

Ниже приведены записи в моем индексе тестовых данных и с использованием эластичного поиска версии 5.6.

[
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "123",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=1",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "126",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "124",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "125",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test1"
    }
  },
  {
    "_index": "test-data",
    "_type": "log",
    "_id": "128",
    "_score": 2,
    "_source": {
      "request": "/test-url/poll?request_ids=2",
      "user": "test2"
    }
  }
]

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

{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "request"
          }
        },
        {
          "regexp": {
            "request.keyword": "/test-url/poll\\?request_ids=.*"
          }
        }
      ]
    }
  },
  "_source": ["request.keyword", "user.keyword","request", "user"], 
  "aggs": {
    "request_count": {
          "cardinality": {
            "script": {
              "lang": "painless", 
              "source": "[doc['request.keyword'], doc['user.keyword']]"
            }
          }
        }
  }
}

Может кто-нибудь подсказать, что не так с запросом или каким-либо другим вариантом решения этой проблемы?

1 Ответ

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

Я думаю, вы должны попробовать следующее:

“[doc['request.keyword'].value + ' ' + doc['user.keyword']].value”

Это вычислит хэши поля, которые будут объединенной строкой из двух значений - запроса и пользователя

Caveat- это было бы значительным ударом по производительности, так как он вычисляет и извлекает значения полей на лету

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...