I'm using a NativeSearchQuery with setTrackScores(true). This query is passed to the ElasticsearchRestTemplate#search(Query, Clazz) (inherited from AbstractElasticsearchTemplate#(Query, Clazz) The Clazz here is a typical data object (bean). It includes a Transient annotation for score, as the persistence backend is not concerned with or stores this field..
The score field is also concerned with surfacing the score provided in the query to each SearchHit returned by the ElasticsearchRestTemplate#search(query, clazz) .
Looping through the hits, I see a score value, e.g., hit.getScore(),
SearchHits<Type> searchHits = restTemplate(query, Type.class);
for (SearchHit hit : searchHits) {
log.debug("Score: {}", hit.getScore());
}
but, the score value is not mapped to the score field is null in hit.getContent():
SearchHit: Object{ properties... , score=null}
I have a sense this is something I'm overlooking, but need some pointers from some experienced users/devs.
How do I surface the score of the results in a List of SearchHits<Type> from a NativeSearchQuery?
I think this is related to calling searchHits.map(SearchHit::getContent).stream and collecting the List<Type>. Here getContent sees score as null because the value is Transient in the entity.
Yes, there's probably a better way to express that, but I needed the brute force to get the score set on the Type under iteration. Ignoring that, I have new error...
Suppressed: org.elasticsearch.client.ResponseException: method [POST], host [http://localhost:9200], URI [/type/_search?typed_keys=true&max_concurrent_shard_requests=5&search_type=query_then_fetch&batched_reduce_size=512], status line [HTTP/1.1 400 Bad Request]
{
"error": {
"root_cause":[
{
"type":"query_shard_exception",
"reason":"No mapping found for [score] in order to sort on",
"index_uuid":"a3PUxitKTBy72gDFLBKkzA",
"index":"type"
}
],
"type":"search_phase_execution_exception",
"reason":"all shards failed",
"phase":"query",
"grouped":true,
"failed_shards":[
{
"shard":0,
"index":"type",
"node":"-ps3vmwyRfWdy_Ry3_7AGw",
"reason":{
"type":"query_shard_exception",
"reason":"No mapping found for [score] in order to sort on",
"index_uuid":"a3PUxitKTBy72gDFLBKkzA",
"index":"type"
}
}
]
},
"status":400
}
I honestly don't know how to solve this. I'm resorting to Google-fu.
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.