web-dev-qa-db-fra.com

Aucun mappage trouvé pour le champ afin d'effectuer un tri dans ElasticSearch

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?

99
Yadu

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:

103
Yadu

Pour ceux qui recherchent un exemple des deux ignore_unmapped et unmapped_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.

37
Navneet Kumar

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.

3
mahemoff

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" }
    }
  ]
}
2
Brian Sanchez

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.

2
James Boutcher

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"
    }
}
0
Rafal Enden

si vous utilisez es 6.7

essaye celui-là

sort : ["title.keyword:desc"]
0
Khalid Skiod