如何在 Spring Data Elasticsearch 中使用多术语过滤器?

问题描述 投票:0回答:1

我希望实现以下rest api:

POST /t_source_item/_search?typed_keys=true&search_type=query_then_fetch
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags.id": {
              "value": "1"
            }
          }
        },
        {
          "term": {
            "tags.id": {
              "value": "2"
            }
          }
        }
      ]
    }
  }
}

下面是我写的代码:

import org.springframework.data.elasticsearch.client.elc.NativeQuery

val query = NativeQuery.builder().withQuery { q1 ->
    q1.bool { b ->
        b.filter { q2 ->
            q2.term { tq ->
                listOf(1L, 2L).forEach { t ->
                    tq.field("tags.id").value(t)
                }
                tq
            }
        }
    }
}.build()
val searchHits = elasticsearchOperations.search(query, Book::class.java)

但我总是只得到最后一个

term
而不是多个
term
,其余api结果如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags.id": {
              "value": 2
            }
          }
        }
      ]
    }
  }
}

正确的做法应该是什么?我正在使用

spring-data-elasticsearch:5.0.3

java kotlin elasticsearch spring-data-elasticsearch
1个回答
0
投票

您正在使用

forEach
和标签 id 来设置同一术语查询的 id,这就是为什么您只看到最后设置的值。 您必须使用循环来创建单独的过滤器查询:

val query = NativeQuery.builder().withQuery { q1 ->
  q1.bool { b ->
    listOf(1L, 2L).forEach { t ->
      b.filter { q2 ->
        q2.term { tq ->
          tq.field("tags.id").value(t)
          tq
        }
      }
    }
    b
  }
}.build()
© www.soinside.com 2019 - 2024. All rights reserved.