简体   繁体   English

ElasticSearch 如何为 QueryBuilder (Java API) 设置特定索引

[英]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我正在尝试将 elasticsearch 的这种多重GET操作转换为Java/Kotlin代码等效项

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. SOMETHING1SOMETHING2代码块并不那么重要。
The problem of my solution is that I can't be able to specify for qbFirst to consider ONLY index1 for the research.我的解决方案的问题是我无法指定qbFirst考虑index1进行研究。 Unfortunately it uses both index1 and index2 (and the same for qbSecond)不幸的是它同时使用了index1index2 (对于 qbSecond 也是如此)
Any Ideas?有任何想法吗?

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:现在,由于indices查询已在 ES 5 中弃用并在 ES 6 中删除,如果您升级,则需要在_index字段上进行搜索,如下所示:

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. PS:还要注意,除非您有一个文档同时出现在两个索引中并且满足两个条件,否则您应该在顶级查询中使用should而不是must

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM