Q:

Elasticsearch: search words connected by, ends with or contain a specific symbol

I am new to Elasticsearch and still learning it. I have an index named article. The documents in the index has a field called body which contains text of an article. The language of the texts is Hindi.
I wish to find words connected by a special symbol hyphen(-).
If I search for an article by id, I get the results like below:
GET /article/_doc/<some id>

{
  "_index" : "article",
  "_type" : "_doc",
  "_id" : "<some id>",
  "_version" : 1,
  "_seq_no" : 495,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "web_source" : "<some source>",
    "web_url" : "<some url>",
    "body" : """
 ... उत्तर-पूर्व में चीन, नेपाल और भूटान, पूर्व में बांग्लादेश और म्यान्मार स्थित हैं। हिन्द महासागर में इसके दक्षिण पश्चिम में मालदीव, दक्षिण में श्रीलंका और दक्षिण-पूर्व में इंडोनेशिया से भारत की सामुद्रिक सीमा लगती है। इसके उत्तर की भौतिक सीमा हिमालय पर्वत से और दक्षिण में हिन्द महासागर से लगी हुई है। पूर्व में बंगाल की खाड़ी है तथा पश्चिम में अरब सागर हैं। ...
  """,
      "updated" : "<some date>"
  }
}

Clearly, the body field contains words such as दक्षिण-पूर्व and उत्तर-पूर्व. I wish to find all such words.
When I run the following query, it gives me a number of results, one of them being the document above.
GET /article/_search
{
    "query": {
        "match": {
            "body" : "उत्तर-पूर्व"
        }
    },
    "highlight" : {
        "fields" : {
            "body" : {}
        }
    }
}

Note: I have tried the below query without any gains i.e. it returns 0 hits. 
POST /article/_doc/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "body": "*-*"
                    }
                }
            ]
        }
    }
}

A:

As mentioned in the comment, you are using the default mapping, which would use the default standard analyzer, which would remove the - while indexing, hence you are not getting when searching for *_*.
match query is analyzed which uses the same analyzer which was used at the index time, hence it would also remove the - for search terms, that is why it gave results. From the same doc of the match query:

Returns documents that match a provided text, number, date or boolean
  value. The provided text is analyzed before matching.

Solution :- use the custom analyzer if you want to search for _ as well, which uses the keyword tokenizer with lower case, as I verified and Hindi analyzer also removes the -.
Tokens generated with Hindi analyzer
POST /article/_analyze --> noyte `-` removed

{
    "analyzer" : "hindi",
    "text" : "उत्तर-पूर्व"
}

{
    "tokens": [
        {
            "token": "उततर",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "पुरव",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

Custom analyzer def (lowercasekeyword)
{
    "settings": {
        "analysis": {
            "analyzer": {
                "lowercasekeyword": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    }
}

Tokens generated with above custom analyzer
POST articles/_analyze
{
    "analyzer" : "lowercasekeyword",
    "text" : "उत्तर-पूर्व"
}

{
    "tokens": [
        {
            "token": "उत्तर-पूर्व",
            "start_offset": 0,
            "end_offset": 11,
            "type": "word",
            "position": 0
        }
    ]
}

Important note: you should create another field and on which include this lowercasekeyword analyzer and use it for your wildcard searches. As mentioned earlier match queries are analyzed and wouldn't work on this field.

