Thursday 21 January 2016

Searching Elasticsearch index for matching data

The indexed document in Elasticsearch can be searched with matching criteria using various Query DSLs available. We can define the fields to be searched and the kind of data we require. There is variety of search options available with Elasticsearch which we will be discussing in upcoming topics.

In this post, let’s see how search works and how to do it using REST service and Java API.

Search index using REST API:

1. URI search

$ curl -XGET 'http://localhost:9200/simplyjava/user/_search?q=userName:steve’

The above search will retrieve all the users who have name “steve”. It will look up for complete word and partial matches will not be retrieved.

Response:
{
   "took": 7,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1.4054651,
      "hits": [
         {
            "_index": "simplyjava",
            "_type": "user",
            "_id": "4",
            "_score": 1.4054651,
            "_source": {
               "userName": "Steve",
               "place": "Texas",
               "age": "29",
               "location": {
                  "lat": "80.234",
                  "lon": "-120.4"
               }
            }
         }
      ]
   }
}

2. Search with request body

The search can also be made by building request body using various query DSL statements in Elasticsearch. Below is an example of sending data as part of request body.

$ curl -XGET 'http://localhost:9200/simplyjava/user/_search –d’{
  "query": {
      "match ": {
         "userName": " steve"
      }
}
}’

Search index using Java API:

Below is the sample code snippet to build the search request and invoke the elasticsearch API to retrieve the results.

Code

QueryBuilder qb1 = QueryBuilders.matchQuery("userName", "steve");
SearchResponse response = client.prepareSearch("simplyjava")
                                         .setQuery(qb1).execute().actionGet();
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(“Id : “ + hit.getId());
System.out.println(“Source : “+hit.getSourceAsString());
}

Output

Id : 4
Source : {
    "userName":"Steve",
    "place":"Texas",
    "age":"29",
    "location":{
        "lat":"80.234",
        "lon":"-120.4"
}

}


Note: We can also search for partial keywords as well. It will be covered in future topics.

No comments:

Post a Comment