Как создать все перестановки дочерних документов в Elasticsearcherch - PullRequest
0 голосов
/ 29 мая 2018

Привет У меня есть следующая схема пользовательских объектов:

curl -X PUT "localhost:9200/test_example" -H 'Content-Type: application/json' -d'
{
    "mappings": {
        "answer" : {
            "_parent" : {
                "type" : "user"
            }
        }
    }
}
'

curl -X PUT "localhost:9200/test_example/user/_bulk?pretty" -H 'Content-Type: application/json' -d'
{ "index": {"_id": 1} }
{ "user": 1, "foo": 1}
{ "index": {"_id": 2} }
{ "user": 2, "foo": 2}
{ "index": {"_id": 3} }
{ "user": 3, "foo": 1}
{ "index": {"_id": 4} }
{ "user": 4, "foo": 1, "answers": {"5": [6,3], "6":[6], "7":[6]}, "potential_approach": true}
'

curl -X PUT "localhost:9200/test_example/answer/_bulk?pretty" -H 'Content-Type: application/json' -d'
{ "index": { "parent": 1}}
{"question":5, "answer":6, "negative": false}
{ "index": { "parent": 1}}
{"question":5, "answer":3, "negative": false}
{ "index": { "parent": 1}}
{"question":6, "answer":6, "negative": false}
{ "index": { "parent": 1}}
{"question":7, "answer":6, "negative": false}
{ "index": { "parent": 2}}
{"question":5, "answer":6, "negative": false}
{ "index": { "parent": 2}}
{"question":5, "answer":3, "negative": false}
{ "index": { "parent": 2}}
{"question":6, "answer":1, "negative": false}
{ "index": { "parent": 2}}
{"question":7, "answer":2, "negative": false}
{ "index": { "parent": 3}}
{"question":5, "answer":6, "negative": false}
{ "index": { "parent": 3}}
{"question":5, "answer":2, "negative": false}
{ "index": { "parent": 3}}
{"question":6, "answer":4, "negative": false}
{ "index": { "parent": 3}}
{"question":7, "answer":3, "negative": false}
'

Теперь я хочу создать счетчик всех пользователей, разделенных по их вопросам, ответы

Так что создайте разбивку пользователей и всехих вопрос отвечает на перестановки:

{Q: 1, A: 1} и одновременно {Q2, A: 1}, затем {Q: 1, A: 2} и одновременно {Q2, A: 1} ... и т. Д.

Концептуально что-то вроде этой агрегации:

curl -X POST "localhost:9200/test_example/user/_search?pretty&size=1"
-H 'Content-Type: application/json' -d' {   "query": {},   "aggs": {
    "permutations": {
      "children": {
        "type": "answer"
      },
      "aggs": {
        "filtered": {
          "filter": {
            "bool": {
              "should": [],
              "must_not": [],
              "must": [
                {
                  "term": {
                    "question": 5
                  }
                }
              ]
            }
          },
          "aggs": {
            "5": {
              "terms": {
                "field": "answer",
                "size": 500
              },
              "aggs": {
                "filtered": {
                  "filter": {
                    "bool": {
                      "should": [],
                      "must_not": [],
                      "must": [
                        {
                          "term": {
                            "question": 6
                          }
                        }
                      ]
                    }
                  },
                  "aggs": {
                    "6": {
                      "terms": {
                        "field": "answer",
                        "size": 500
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }   } } '

Я понимаю, почему это не работает, потому что одно ведро исключает документы, которые я хотел быиметь в подкатегории, но мне интересно, если есть другие подходы к проблеме reverse nested aggregation может сделать это, но у меня есть дочерние документы вместо вложенных.

Один из подходов, который я мог бы принять, будетвозможно, сохраняя все ответы на объекте пользователя в форме, которую я добавил на пользователя 4, тогда что-то вроде этого будет работать нормально:

curl -X POST "localhost:9200/test_example/user/_search?pretty&size=1" -H 'Content-Type: application/json' -d'
{
  "query": {},
  "aggs": {
    "filtered": {
      "filter": {
        "bool": {
          "should": [],
          "must_not": [],
          "must": []
        }
      },
      "aggs": {
        "5": {
          "terms": {
            "field": "answers.5",
            "size": 500
          },
          "aggs": {
            "filtered": {
              "filter": {
                "bool": {
                  "should": [],
                  "must_not": [],
                  "must": []
                }
              },
              "aggs": {
                "6": {
                  "terms": {
                    "field": "answers.6",
                    "size": 500
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
'

Следующий запрос будет генерировать именно то, что я хочу, моя главная проблема заключается в том, что есть2000 вопросов ID, так что я волнуюсь за несколько миллионовПользовательские строки, Elasticsearch может взорвать для меня (некоторые пользователи могли бы ответить на 500-700 различных вопросов).Есть ли какие-либо подходы, которые я мог бы использовать для работы со схемой, где ответы являются дочерними документами?Или, может быть, есть способ проверить, может ли ES обрабатывать документы с потенциально большим количеством ключей.

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