Elasticsearch: Les champs de valeur nulle dans les requêtes custom_score provoquent des erreurs "Aucun champ"

Créé le 9 févr. 2011  ·  5Commentaires  ·  Source: elastic/elasticsearch

Il semble y avoir un piège lors de l'utilisation de requêtes custom_score et de la tentative de notation basée sur des champs pouvant contenir des valeurs nulles.

Vu que j'ai :

{"user": {"name": "John", "position": null}}

Lorsque j'interroge en utilisant un custom_score et un script comme :

{"script": "_score + doc['position'].value"}

J'obtiens l'erreur suivante :

ElasticSearchIllegalArgumentException[No field found for [position]]; }]

Si j'ajoute un autre utilisateur :

{"user": {"name": "Jane", "position": 1}}

Tout fonctionne bien.

Je pense que le comportement par défaut devrait être que les champs de valeur nulle renvoient null - et ne génèrent pas d'erreur.

Les exemples ci-dessus peuvent sembler boiteux, mais imaginez remplir les index avec des données d'une base de données, où aucune garantie ne peut être donnée qu'une colonne ne contiendra rien d'autre que des valeurs nulles. Vous pouvez contourner ce problème en convertissant vos champs en chaînes à l'aide du mappage, mais je suggère définitivement qu'ElasticSearch est capable de gérer la valeur du script de manière plus intelligente.

Commentaire le plus utile

Cela devrait fonctionner :

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Ou peut-être même ceci :

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Même ainsi, avec un ensemble de données suffisant, où au moins un document a une valeur de position sur chaque fragment, vous ne devriez pas avoir besoin de cette vérification, et les performances de votre script seront alors bien meilleures.

Tous les 5 commentaires

Oh - et merci pour un produit génial ! :-)

Salut,

Cela se produit parce que ce champ n'a pas encore été introduit (il a une valeur nulle). Une fois qu'il est introduit (avec une seule valeur, dans le cluster), cela fonctionnera bien. Vous pouvez également définir null-value dans les mappages qui indexeront une valeur nulle spécifique lorsque ce champ a la null . Puisqu'il n'est pas introduit, son type ne peut pas être dérivé.

Oui, je comprends cela. Ne serait-il pas préférable que la valeur du script renvoie null ou au moins ait une sorte de fonction pour vérifier son existence, au lieu de déclencher une exception et de ne renvoyer aucun résultat?

Par exemple:

{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}

Cela devrait fonctionner :

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Ou peut-être même ceci :

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Même ainsi, avec un ensemble de données suffisant, où au moins un document a une valeur de position sur chaque fragment, vous ne devriez pas avoir besoin de cette vérification, et les performances de votre script seront alors bien meilleures.

Erreur fatale : non intercepté [NoFieldFound]Aucun champ trouvé : Contact._PloiciesLastApplicationDate0 Tentative : 1 fois. jeté

J'obtiens l'erreur suivante lors de la mise à jour du contact.

par exemple :-

$checkExist = Infusionsoft_DataService::query(new Infusionsoft_Contact(), array('Phone1' => '(618)-795-0304'));

Je récupère le contact et le met à jour en fonction du numéro de téléphone, mais cela donne-t-il cette erreur ?

Merci!

Cette page vous a été utile?
0 / 5 - 0 notes