Elasticsearch lève un SearchParseException
lors de l'analyse d'une requête s'il existe des documents ne contenant pas de champ utilisé dans les critères de tri.
SearchParseException: Echec de l'analyse [Aucune cartographie trouvée pour [prix] pour pouvoir effectuer le tri]
Comment puis-je effectuer une recherche avec succès dans ces documents, même s'il manque le champ price
?
Après avoir creusé davantage, j'ai trouvé la solution ci-dessous. ignore_unmapped
devrait être explicitement défini sur true
dans la clause de tri.
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
Pour plus d'informations, consultez les références Elasticsearch pour:
Pour ceux qui recherchent un exemple des deux
ignore_unmapped
etunmapped_type
s'il vous plaît voir ma réponse ici .
Notez que "ignore_unmapped" est maintenant déconseillé en faveur de "unmapped_type". Cela a été fait dans le cadre de # 7039
D'après la documentation: Avant 1.4.0, il existait le paramètre booléen ignore_unmapped, qui ne suffisait pas pour décider des valeurs de tri à émettre et qui ne fonctionnait pas pour la recherche par index croisé. Il est toujours pris en charge, mais les utilisateurs sont invités à migrer vers le nouveau unmapped_type.
Par défaut, la demande de recherche échouera si aucun mappage n'est associé à un champ. L'option unmapped_type permet d'ignorer les champs non mappés et de ne pas les trier. La valeur de ce paramètre est utilisée pour déterminer les valeurs de tri à émettre. Voici un exemple d'utilisation:
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
Si l'un des index interrogés n'a pas de mappage de prix, Elasticsearch le gérera comme s'il y avait un mappage de type long, tous les documents de cet index n'ayant aucune valeur pour ce champ.
Apparemment, ElasticSearch ne triera pas les valeurs NULL. Je supposais que cela traiterait null comme étant au début ou à la fin (comme avec la commande SQL) mais je crois que cela déclenche également cette erreur.
Donc, si vous voyez cette erreur, vous devrez peut-être vous assurer que l'attribut de tri a une valeur par défaut lorsqu'il est envoyé à ElasticSearch.
J'ai eu cette erreur avec Rails + ElasticSearch + Tire parce que la colonne de tri n'avait pas de valeur par défaut, elle était donc envoyée à ES avec la valeur null.
Ce problème indique que les valeurs nulles sont gérées, mais ce n'était pas mon expérience. C'est quelque chose qui vaut la peine d'essayer quand même.
Elasticsearch 6.4
spécifiez simplement l'index et le tour est joué à Kibana
AVANT
GET /_search
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}
APRÈS
GET /document-index/contact/_search (here)
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}
J'ai rencontré le même problème (sorta; certaines erreurs seraient générées, mais certains résultats), mais dans mon cas, ma recherche était émise à la racine (aucun index spécifié), et les erreurs que j'obtenais étaient dues au fait que la recherche/commande était également regardant à un indice de Kibana.
Erreur stupide, mais peut-être que ça va aider quelqu'un d'autre qui finit ici.
Vous pouvez également utiliser un script qui vous donne une certaine flexibilité:
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "return !doc['price'].empty ? doc['price'].value : 0"
},
"order" : "desc"
}
}
si vous utilisez es 6.7
essaye celui-là
sort : ["title.keyword:desc"]