elasticsearch 超出Elasticsearch index.mapping.nested_objects.limit
我们有一个由票组成的索引。每个票都有对象视图。每个object_views告诉我们给定的用户是否看到了票据(已查看)或未看到票据(新) 当用户进入我们的应用程序时,他可以选择他已经查看过的票证并对它们进行排序(我们使用一个数值进行排序,因为我们有其他状态) 现在的问题是,我们有超过10000个用户,因此我们达到了Elasticsearch的最大嵌套对象限制。有没有办法不使用嵌套对象并保持这种排序和筛选功能 我们想到了去规范化:elasticsearch 超出Elasticsearch index.mapping.nested_objects.limit,elasticsearch,elasticsearch,我们有一个由票组成的索引。每个票都有对象视图。每个object_views告诉我们给定的用户是否看到了票据(已查看)或未看到票据(新) 当用户进入我们的应用程序时,他可以选择他已经查看过的票证并对它们进行排序(我们使用一个数值进行排序,因为我们有其他状态) 现在的问题是,我们有超过10000个用户,因此我们达到了Elasticsearch的最大嵌套对象限制。有没有办法不使用嵌套对象并保持这种排序和筛选功能 我们想到了去规范化: user_id_1_viewsed:true=>但我们将在Elas
- user_id_1_viewsed:true=>但我们将在Elasticsearch中达到1000个字段的限制
- 用户:[“用户id\u 1\u查看过的\u 1”、“用户id\u 2\u新的\u 0”]=>但是过滤和排序真的很麻烦
- 使用某种父关系而不是嵌套对象(我们还不确定是否有这种关系) 您将在下面找到:
- 映射
- 票1
- 票2
- 票3
- 搜索用户1正在执行以下操作:
PUT ticket
{
"mappings": {
"properties": {
"object_views": {
"type": "nested",
"properties": {
"number_rank": {
"type": "double"
},
"string_status": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"user_id": {
"type": "long"
}
}
},
"string_ticket_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
PUT ticket/_doc/1
{
"string_ticket_name": "ticket A",
"object_views" : [
{
"user_id": 1,
"string_status": "viewed",
"number_rank" : 1
},
{
"user_id": 2,
"string_status": "new",
"number_rank" : 0
}
]
}
PUT ticket/_doc/2
{
"string_ticket_name": "ticket B",
"object_views" : [
{
"user_id": 1,
"string_status": "new",
"number_rank" : 0
},
{
"user_id": 2,
"string_status": "viewed",
"number_rank" : 1
}
]
}
PUT ticket/_doc/3
{
"string_ticket_name": "ticket C",
"object_views" : [
{
"user_id": 1,
"string_status": "viewed",
"number_rank" : 1
},
{
"user_id": 2,
"string_status": "viewed",
"number_rank" : 1
}
]
}
GET ticket/_search
{
"query": {
"bool": {
"filter": [
{
"bool": {
"must": [
{
"nested": {
"path": "object_views",
"query": {
"bool": {
"filter": [
{
"bool": {
"must": [
{
"terms": {
"object_views.user_id": [
1
]
}
},
{
"terms": {
"object_views.string_status.keyword": [
"viewed"
]
}
}
]
}
}
]
}
}
}
}
]
}
}
]
}
},
"sort": [
{
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "int status_value = 0; for (item in params._source.object_views) { if (item['user_id'] == 1) {status_value = item['number_rank'];} } return status_value;"
},
"order": "asc"
}
}
]
}