Можно ли выполнить подсчет/количество пользователей с логической связью в ElasticSearch?

У меня есть документы пользователей в следующем формате:

{
    userId: "<userId>",
    userAttributes: [
        "<Attribute1>",
        "<Attribute2>",
        ...
        "<AttributeN>"
    ]
}

Я хочу иметь возможность получить количество уникальных пользователей, которые отвечают на логический оператор, например Сколько пользователей имеют атрибут1 И атрибут2 ИЛИ атрибут3?

Я прочитал о функции кардинальности в агрегация кардинальности, но, похоже, он работает для одного значения, не имея логических возможностей "И" и "ИЛИ".

Обратите внимание, что у меня около 1 000 000 000 документов, и мне нужны результаты как можно быстрее, поэтому я смотрел на оценку количества элементов.


person Roee Gavirel    schedule 12.04.2016    source источник
comment
Агрегация кардинальности выглядит очевидным решением. Ты это пробовал? Он делает то, что вы хотите? Я не уверен, что полностью понял ваш пост...   -  person Andrei Stefan    schedule 12.04.2016
comment
@AndreiStefan - это очень хорошо работает для одного атрибута. но я не нашел способа включить в него логику И и ИЛИ. Я не уверен, что я что-то упускаю или это просто не поддерживается.   -  person Roee Gavirel    schedule 12.04.2016
comment
Хорошо, это отличается от того, что вы изначально спросили. Можете ли вы обновить свой пост, указав сопоставление для userAttributes и запрос, который вы попытались сделать, но не смогли заставить его работать?›   -  person Andrei Stefan    schedule 12.04.2016


Ответы (1)


Как насчет этой попытки, рассматривая userAttributes как простой массив string (анализируется в моем случае, но с отдельными строчными буквами):

POST /users/user/_bulk
{"index":{"_id":1}}
{"userId":123,"userAttributes":["xxx","yyy","zzz"]}
{"index":{"_id":2}}
{"userId":234,"userAttributes":["xxx","yyy","aaa"]}
{"index":{"_id":3}}
{"userId":345,"userAttributes":["xxx","yyy","bbb"]}
{"index":{"_id":4}}
{"userId":456,"userAttributes":["xxx","ccc","zzz"]}
{"index":{"_id":5}}
{"userId":567,"userAttributes":["xxx","ddd","ooo"]}

GET /users/user/_search
{
  "query": {
    "query_string": {
      "query": "userAttributes:(((xxx AND yyy) NOT zzz) OR ooo)"
    }
  },
  "aggs": {
    "unique_ids": {
      "cardinality": {
        "field": "userId"
      }
    }
  }
}

что дает следующее:

  "hits": [
     {
        "_index": "users",
        "_type": "user",
        "_id": "2",
        "_score": 0.16471066,
        "_source": {
           "userAttributes": [
              "xxx",
              "yyy",
              "aaa"
           ]
        }
     },
     {
        "_index": "users",
        "_type": "user",
        "_id": "3",
        "_score": 0.04318809,
        "_source": {
           "userAttributes": [
              "xxx",
              "yyy",
              "bbb"
           ]
        }
     },
     {
        "_index": "users",
        "_type": "user",
        "_id": "5",
        "_score": 0.021594046,
        "_source": {
           "userAttributes": [
              "xxx",
              "ddd",
              "ooo"
           ]
        }
     }
  ]
person Andrei Stefan    schedule 12.04.2016