Привет У меня есть следующая схема пользовательских объектов:
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 обрабатывать документы с потенциально большим количеством ключей.