# Prepare SearchRequest for exact search on multiple fields \[Java\]

**URL:** https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909
**Category:** Elasticsearch
**Created:** [February 4, 2019, 7:06am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909 "2019-02-04T07:06:46Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![ravi089](https://avatars.discourse-cdn.com/v4/letter/r/45deac/32.png) [@ravi089](https://discuss.elastic.co/u/ravi089)
#### Post date: [February 4, 2019, 7:06am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/1 "2019-02-04T07:06:47Z")

</div>

I want to form a search request for exact match on multiple fields. Now match query returns all matches whereas term query does the search on inverted index.

```
	SearchRequest searchRequest = new SearchRequest(ES_INDEX);
	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

	BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
	QueryBuilder typeTerm = QueryBuilders.termsQuery("info.type", type);
	queryBuilder.must(typeTerm);
	
	searchSourceBuilder.query(matchQueryBuilder);
	
	searchRequest.source(searchSourceBuilder);
    	SearchResponse searchResponse = restHighLevelClient.search(searchRequest);
```

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 4, 2019, 7:51am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/2 "2019-02-04T07:51:56Z")

</div>

Must it match the same exact term on all fields or at least the exact term on one field ?

If the later, I'd use a keyword data type on the fields and a multimatch query.

---

<div class="post-metadata">

### Author: ![ravi089](https://avatars.discourse-cdn.com/v4/letter/r/45deac/32.png) [@ravi089](https://discuss.elastic.co/u/ravi089)
#### Post date: [February 4, 2019, 7:54am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/3 "2019-02-04T07:54:03Z")

</div>

There could be a case I need to form multi word query and on some query I need exact search whereas on others I need full text search.

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 4, 2019, 8:11am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/4 "2019-02-04T08:11:09Z")

</div>

You can index the same content once with a text field and once with a keyword field.  
Then you can choose at search time on which fields you want to search.

---

<div class="post-metadata">

### Author: ![ravi089](https://avatars.discourse-cdn.com/v4/letter/r/45deac/32.png) [@ravi089](https://discuss.elastic.co/u/ravi089)
#### Post date: [February 4, 2019, 8:15am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/5 "2019-02-04T08:15:53Z")

</div>

Can you please provide me an example. I tried it with Keyword data type but things don't seem to be working.

```auto
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Questionnaire extends Event {
	public Questionnaire() {
		super();
	}

	@JsonProperty("id")
	private String id;

	@JsonProperty("type")
	@Field(type = FieldType.Keyword)
	private String type;
	
	@JsonProperty("level")
	@Field(type = FieldType.Keyword)
	private Integer level;
	
	@JsonProperty("category")
	@Field(type = FieldType.Keyword)
	private List<String> category = null;

```

Below is the query :-

```auto
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
	QueryBuilder typeTerm = QueryBuilders.matchQuery("questionnaire.type", type);
	queryBuilder.must(typeTerm);
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);

```

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 4, 2019, 9:40am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/6 "2019-02-04T09:40:38Z")

</div>

I edited your post to make it readable. Please format your code either with markdown format or by using the `</>` icon.

Are you using Hibernate Search? Wondering this because of:

```auto
@Field(type = FieldType.Keyword)

```

If you want to be able to search `type` with both Full Text search and Exact search, you need to index it like:

```auto
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "type": {
          "type": "text",
          "fields": {
            "raw": { 
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

```

Then if you search on `type`, it will be a full text search. If you search on `type.raw` it will be an exact search.

---

<div class="post-metadata">

### Author: ![ravi089](https://avatars.discourse-cdn.com/v4/letter/r/45deac/32.png) [@ravi089](https://discuss.elastic.co/u/ravi089)
#### Post date: [February 4, 2019, 9:46am UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/7 "2019-02-04T09:46:50Z")

</div>

No I am not using Hibernate.

It's basically Spring boot application.

---

<div class="post-metadata">

### Author: ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)
#### Post date: [February 4, 2019, 12:04pm UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/8 "2019-02-04T12:04:49Z")

</div>

How does this work?

```auto
@Field(type = FieldType.Keyword)

```

Are you sure it is generating the right mapping in Elasticsearch?

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [March 4, 2019, 12:04pm UTC](https://discuss.elastic.co/t/prepare-searchrequest-for-exact-search-on-multiple-fields-java/166909/9 "2019-03-04T12:04:52Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
