1

I'm trying to convert this multiple GET operation of elasticsearch into the Java/Kotlin code equivalent

curl "localhost:9200/index1, index2/_search?pretty=true" -d '{
    "query" : {
        "bool" : {
            "must" : [
                {
                    "indices" : {
                        "indices" : ["index1"],
                        "query" : {
                            SOMETHING1
                        }
                    }
                },
                {
                    "indices" : {
                        "indices" : ["index2"],
                        "query" : {
                            SOMETHING2
                        }
                    }
                }
            ]
        }
    }
}'

My solution is

val searchRequest = SearchRequest("index1", "index2")
val searchSourceBuilder = SearchSourceBuilder()
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()

val qbFirst: BoolQueryBuilder = QueryBuilders.boolQuery()
qbFirst.must().add(SOMETHING1)

val qbSecond: BoolQueryBuilder = QueryBuilders.boolQuery()
qbSecond.must().add(SOMETHING2)

qb.must().add(qbFirst)
qb.must().add(qbSecond)

searchSourceBuilder.query(qb)
searchRequest.source(searchSourceBuilder)

It's not so important the SOMETHING1 and SOMETHING2 code block.
The problem of my solution is that I can't be able to specify for qbFirst to consider ONLY index1 for the research. Unfortunately it uses both index1 and index2 (and the same for qbSecond)
Any Ideas?

1 Answer 1

2

What you need to do is the following:

val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
var q1: XXXBuilder = QueryBuilders.xxxQuery()
var q2: XXXBuilder = QueryBuilders.xxxQuery()

qb.must().add(QueryBuilders.indicesQuery(q1, "index1"))
qb.must().add(QueryBuilders.indicesQuery(q2, "index2"))

Now, since the indices query has been deprecated in ES 5 and removed in ES 6, if you ever upgrade, you'll need to search on the _index field instead, which goes like this:

val qb: BoolQueryBuilder = QueryBuilders.boolQuery()

var q1: BoolQueryBuilder = QueryBuilders.boolQuery()
q1.must().add(QueryBuilders.termQuery("_index", "index1"))
q1.must().add(QueryBuilders.xxxQuery("SOMETHING1"))

var q2: BoolQueryBuilder = QueryBuilders.boolQuery()
q2.must().add(QueryBuilders.termQuery("_index", "index2"))
q2.must().add(QueryBuilders.xxxQuery("SOMETHING2"))

qb.must().add(q1)
qb.must().add(q2)

PS: also note that unless you have a document that is present in both indexes at the same time and satisfies both conditions, you should be using should instead of must in the top-level query.

Sign up to request clarification or add additional context in comments.

1 Comment

Perfect answer! Thanks a lot

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.