Elasticsearch uses just half of cpu cores even under full load
Are you using the default elasticsearch configuration?
Make sure you don't limit the number of threads used for search/bulk/index.The defaults are well optimised, no need to change them. The default number of threads (except for search) is set to the number of cores on your machine. For search it's (number of cores * 3).
An example for this configuration (that you should avoid) for search in elasticsearch.yml file:
threadpool.search.type: fixedthreadpool.search.size: <num-of-threads>
Also, make sure to follow the deployment guidelines to optimise performance.