davide.ferrari
davide.ferrari

Reputation: 221

ElasticSearch how to set specific index for a QueryBuilder (Java API)

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?

Upvotes: 1

Views: 1176

Answers (1)

Val
Val

Reputation: 217504

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.

Upvotes: 2

Related Questions