# Kotlin and Elasticsearch (help! I'm newbie)

**URL:** https://discuss.kotlinlang.org/t/kotlin-and-elasticsearch-help-im-newbie/11485
**Category:** Support
**Created:** [February 7, 2019, 4:20pm UTC](https://discuss.kotlinlang.org/t/kotlin-and-elasticsearch-help-im-newbie/11485 "2019-02-07T16:20:55Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![sandra](https://avatars.discourse-cdn.com/v4/letter/s/4491bb/32.png) [@sandra](https://discuss.kotlinlang.org/u/sandra)
#### Post date: [February 7, 2019, 4:20pm UTC](https://discuss.kotlinlang.org/t/kotlin-and-elasticsearch-help-im-newbie/11485/1 "2019-02-07T16:20:55Z")

</div>

So, I am a total newbie. I have a lot of Jsons in Elasticsearch. And the query I have to do is very simple for me to understand in a traditional database, but I can not understand how to do a subquery here.

My situation is the next:  
All my Jsons have a field of text. FIRST, I have to filter all the jsons that have X, Y or Z keywords in this field. And then the user ask to filter this list and show the ones that have S or T in the field.  
So obviously, I can not do a plain query of filter ALL the jsons that have x, y, z, s or t because that would not comply. What I need is to do a subquery of the first result, but I haven’t been able to do this.  
(it also filters by words that does not want inside the field, but this filter works perfectly)

I write down the code I have until now. I hope someone can help me.  
THANKS!!! 😅  
–excludedKeywords → are the keywords you don’t want that appear on the text  
–keywords → the first original keywords  
–keywordsA-\> the second set of keywords

```
   private fun generateTermsQueryA(excludedKeywords: List<String>, keywords: List<String>, keywordsA: List<String>, field: String = "unifiedText"): BoolQueryBuilder? {
        val excludedTerms = arrayListOf<String>()
        var excludedSubquery = BoolQueryBuilder()
        LOG.info("generateTermsQueryA - field : {}", field)
        excludedKeywords.forEach {
            if (it.contains(" ")) excludedSubquery = excludedSubquery.mustNot(QueryBuilders.matchPhraseQuery(field, it))
            else excludedTerms.add(it)
        }
        if (excludedTerms.isNotEmpty()) {
            excludedSubquery = excludedSubquery.mustNot(QueryBuilders.termsQuery(field, excludedTerms))
        }

        val includedTerms = arrayListOf<String>()
        var includedSubquery = BoolQueryBuilder()
        keywords.forEach {
            if (it.contains(" ")) includedSubquery = includedSubquery.should(QueryBuilders.matchPhraseQuery(field, it))
            else includedTerms.add(it)
        }
        if (includedTerms.isNotEmpty()) {
            includedSubquery = includedSubquery.should(QueryBuilders.termsQuery(field, includedTerms))
        }

        val includedTermsA = arrayListOf<String>()
        var includedSubqueryA = BoolQueryBuilder()
        keywordsA.forEach {
            if (it.contains(" ")) includedSubqueryA = includedSubqueryA.must(QueryBuilders.matchPhraseQuery(field, it))
            else includedTermsA.add(it)
        }
        if (includedTermsA.isNotEmpty()) {
            includedSubqueryA = includedSubqueryA.should(QueryBuilders.termsQuery(field, includedTerms))
        }

        val totalQuery = excludedSubquery.must(includedSubquery).must(includedSubqueryA)

        return totalQuery
    }

```
