With several fields within a mapping you can suffer the consequences of memory errors and situations that will be difficult to recover, this problem is very common, but we managed to avoid.
What I recommend is that the mapping contains only the fields that will actually be used. If even then, the mapping contains 3000 fields, I recommend that this be handled via index. Split these fields into different indexes.
What can also be done, is to increase thshould index.mapping.total_fields.limit to the amount of field the mapping will contain.
You can also leave the mapping pre-defined, and add the option dynamic: true, in this way, if any field is not mapping, it will be created automatically. Or, if you are sure that no fields will be inserted other than the ones you have set, you can add dynamic: false.
Hope this helps.