Desejo implementar a seguinte API rest:
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"
}
}
}
]
}
}
}
Segue abaixo o código que escrevi:
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)
Mas eu sempre recebo apenas o último term
em vez de múltiplo term
, os resultados restantes da API são os seguintes:
{
"query": {
"bool": {
"filter": [
{
"term": {
"tags.id": {
"value": 2
}
}
}
]
}
}
}
Qual deve ser a abordagem correta? estou usando spring-data-elasticsearch:5.0.3
.
Você está usando o
forEach
com a tag ids para definir o id da mesma consulta de termo, é por isso que você vê apenas o último valor que foi definido. Você deve usar o loop para criar consultas de filtro separadas:versão alternativa usando um intervalo em vez de um listOf: