【问题标题】:ElasticSearch how to set specific index for a QueryBuilder (Java API)ElasticSearch 如何为 QueryBuilder (Java API) 设置特定索引
【发布时间】:2020-11-20 09:46:40
【问题描述】:

我正在尝试将 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
                        }
                    }
                }
            ]
        }
    }
}'

我的解决办法是

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)

SOMETHING1SOMETHING2 代码块并不那么重要。
我的解决方案的问题是我无法指定 qbFirst 考虑 ONLY index1 进行研究。不幸的是,它同时使用 index1index2(qbSecond 也是如此)
有什么想法吗?

【问题讨论】:

    标签: java kotlin elasticsearch curl query-builder


    【解决方案1】:

    你需要做的是:

    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"))
    

    现在,由于 indices 查询已被 deprecated in 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:另请注意,除非您的文档同时存在于两个索引中并满足两个条件,否则您应该在顶级查询中使用 should 而不是 must

    【讨论】:

    • 完美答案!非常感谢
    • 太棒了,很高兴它有帮助! (请注意,我没有 Kotlin 知识,所以您可能需要稍微调整一下语法)
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多