我希望实现以下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
。
您正在使用
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()