Aucun mapping trouvé pour field afin de trier dans ElasticSearch
Elasticsearch lance un SearchParseException
en analysant la requête s'il y a des documents trouvés ne contenant pas le champ utilisé dans les critères de tri.
SearchParseException: Analyser l'Échec [Aucune correspondance trouvée pour [prix] dans l'ordre de tri]
Comment puis-je effectuer avec succès une recherche dans ces documents, même s'il manque le champ price
?
5 réponses
après avoir creusé plus, j'ai trouvé la solution comme indiqué ci-dessous. ignore_unmapped
devrait être explicitement défini comme true
dans la clause de tri.
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
pour de plus amples informations, consultez les références Elasticsearch pour:
pour ceux qui cherchent un exemple de
ignore_unmapped
etunmapped_type
s'il vous plaît voir ma réponse ici .
notez que " ignore_unmapped "est maintenant déprécié en faveur de"unmapped_type". Cela a été fait dans le cadre de #7039
de la documentation: avant 1.4.0 il y avait le paramètre booléen ignore_unmapped, qui n'était pas suffisant informations pour décider des valeurs de tri à émettre, et ne fonctionnait pas pour la recherche croisée. Il est toujours pris en charge mais les utilisateurs sont encouragés à migrer vers le nouveau type unmapped_type à la place.
par défaut, la recherche échouera s'il n'y a pas de correspondance associée à un champ. L'option unmapped_type permet d'ignorer les champs qui n'ont pas de mapping 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 de la façon dont il peut à utiliser:
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
si l'un des indices qui sont interrogés n'a pas de mapping for price alors Elasticsearch le traitera comme s'il y avait une mapping de type long, avec tous les documents dans cet index n'ayant aucune valeur pour ce champ.
apparemment ElasticSearch ne classera pas sur les valeurs nulles. Je supposais qu'il traiterait null comme étant au début ou à la fin (comme avec L'ordre de SQL) mais je crois qu'il déclenche également cette erreur.
donc si vous voyez cette erreur, vous pouvez avoir besoin de vous assurer que l'attribut sort a une valeur par défaut quand il est envoyé à ElasticSearch.
j'ai eu cette erreur avec Rails+ElasticSearch+Tire parce que la colonne sort n'avait pas de valeur par défaut, donc était envoyé à ES comme NULL.
ce numéro indique que les valeurs nulles sont manipulées, mais ce n'était pas mon expérience. Ça vaut la peine d'essayer de toute façon.
j'ai éprouvé le même problème (sorta; j'ai eu quelques erreurs, mais quelques résultats), mais dans mon cas ma recherche a été émise à la racine (aucun index spécifié), et les erreurs que j'ai reçues étaient parce que la recherche/ordre était également à la recherche D'un index de Kibana.
erreur stupide, mais peut-être que cela aidera quelqu'un d'autre qui finit ici.
Elasticsearch 6.4
spécifiez simplement l'index et C'est tout à 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" }
}
]
}