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 ?

77
demandé sur Tristan 2013-06-11 22:58:20

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:

91
répondu Yadu 2017-12-19 10:55:53

pour ceux qui cherchent un exemple de ignore_unmapped et unmapped_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.

31
répondu Navneet Kumar 2017-05-23 10:31:11

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.

3
répondu mahemoff 2015-03-29 08:17:14

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.

0
répondu James Boutcher 2014-01-03 17:40:25

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" }
    }
  ]
}
0
répondu Brian Sanchez 2018-09-09 02:40:46