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.
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!
Commentaire le plus utile
Cela devrait fonctionner :
Ou peut-être même ceci :
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.