elasticsearch 超出Elasticsearch index.mapping.nested_objects.limit,elasticsearch,elasticsearch" /> elasticsearch 超出Elasticsearch index.mapping.nested_objects.limit,elasticsearch,elasticsearch" />

elasticsearch 超出Elasticsearch index.mapping.nested_objects.limit

elasticsearch 超出Elasticsearch index.mapping.nested_objects.limit,elasticsearch,elasticsearch,我们有一个由票组成的索引。每个票都有对象视图。每个object_views告诉我们给定的用户是否看到了票据(已查看)或未看到票据(新) 当用户进入我们的应用程序时,他可以选择他已经查看过的票证并对它们进行排序(我们使用一个数值进行排序,因为我们有其他状态) 现在的问题是,我们有超过10000个用户,因此我们达到了Elasticsearch的最大嵌套对象限制。有没有办法不使用嵌套对象并保持这种排序和筛选功能 我们想到了去规范化: user_id_1_viewsed:true=>但我们将在Elas

我们有一个由票组成的索引。每个票都有对象视图。每个object_views告诉我们给定的用户是否看到了票据(已查看)或未看到票据(新)

当用户进入我们的应用程序时,他可以选择他已经查看过的票证并对它们进行排序(我们使用一个数值进行排序,因为我们有其他状态)

现在的问题是,我们有超过10000个用户,因此我们达到了Elasticsearch的最大嵌套对象限制。有没有办法不使用嵌套对象并保持这种排序和筛选功能

我们想到了去规范化:

  • 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"
            }
        }
    ]
}