¿Por qué el resultado de búsqueda de ElasticsearchRestTemplate es diferente al resultado de consulta de Kibana?
Utilizo spring-data-elasticsearch NativeSearchQuery para construir mi consulta, pero el resultado es diferente de Kibana. Este es mi código:
@Autowired
private ElasticsearchRestTemplate restTemplate;
private Page<invitationes> doSearchByKw(String keyword, Pageable pageable) {
HashMap<string, float=""> fields = new HashMap<>(2);
fields.put("title", 1.0F);
fields.put("content", 0.8F);
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
boolQuery().should(boolQuery().must(queryStringQuery(keyword).fields(fields).boost(10))));
NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(functionScoreQueryBuilder)
.withPageable(pageable).withSort(SortBuilders.scoreSort()).build();
SearchHits<invitationes> searchHits = restTemplate.search(build, InvitationEs.class);
SearchPage<invitationes> page = SearchHitSupport.searchPageFor(searchHits, pageable);
return (Page<invitationes>) SearchHitSupport.unwrapSearchHits(page);
}
La consola imprime el cuerpo de la solicitud:
{
"from": 0,
"size": 10,
"query": {
"function_score": {
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"query_string": {
"query": "坦度",
"fields": [
"content^0.8",
"title^1.0"
],
"type": "best_fields",
"default_operator": "or",
"max_determinized_states": 10000,
"enable_position_increments": true,
"fuzziness": "AUTO",
"fuzzy_prefix_length": 0,
"fuzzy_max_expansions": 50,
"phrase_slop": 0,
"escape": false,
"auto_generate_synonyms_phrase_query": true,
"fuzzy_transpositions": true,
"boost": 10.0
}
}
]
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"functions": [],
"score_mode": "multiply",
"max_boost": 3.4028235E38,
"boost": 1.0
}
},
"version": true,
"explain": false,
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
Cuando copio este cuerpo de la solicitud a Kibana, el resultado es correcto, pero el orden de “searchHits” es incorrecto, ¿por qué cambia el “score”?
Aquí puede ver el “score” y el orden de “searchHits”: https://i.stack.imgur.com/gRmpC.png
Aquí puede ver el resultado de Kibana: https://i.stack.imgur.com/mq0mU.png</string,>
davy.ai
Es posible que las diferencias en la puntuación y ordenamiento se deban a diferencias en la forma en que Elasticsearch y Kibana manejan la puntuación de relevancia. Elasticsearch y Kibana usan algoritmos de puntuación de relevancia ligeramente diferentes, lo que puede resultar en diferentes puntajes y ordenamiento de los resultados de búsqueda, incluso cuando se utiliza la misma consulta.
Una posible explicación para la diferencia en el ordenamiento es que Elasticsearch y Kibana pueden estar utilizando diferentes opciones de ordenamiento predeterminadas. En el ejemplo de código proporcionado, los resultados de búsqueda se ordenan por puntaje utilizando
SortBuilders.scoreSort ()
. Es posible que Kibana esté utilizando una opción de ordenamiento predeterminada diferente que esté afectando el orden de los resultados de búsqueda.Otra posible explicación es que Elasticsearch y Kibana están utilizando diferentes pesos de campo. En el ejemplo de código proporcionado, el campo
title
tiene un peso de1.0
, mientras que el campocontent
tiene un peso de0.8
. Es posible que Kibana esté utilizando diferentes pesos de campos que estén afectando la puntuación de los resultados de búsqueda.En general, es importante tener en cuenta que diferentes plataformas de búsqueda pueden manejar la puntuación de relevancia y el ordenamiento de manera diferente, y que la misma consulta no siempre producirá resultados idénticos en diferentes plataformas.