Elasticsearch: Los campos de valor nulo en las consultas custom_score provocan errores de 'Sin campo'

Creado en 9 feb. 2011  ·  5Comentarios  ·  Fuente: elastic/elasticsearch

Parece que hay un problema cuando se usan consultas custom_score y se intenta puntuar en función de campos que pueden contener valores nulos.

Dado que tengo:

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

Cuando consulto usando un custom_score y un script como:

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

Obtuve el siguiente error:

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

Si agrego otro usuario:

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

Todo funciona bien.

Creo que el comportamiento predeterminado debería ser que los campos de valor nulo devuelvan nulo y no generen un error.

Los ejemplos anteriores pueden parecer tontos, pero imagine llenar los índices con datos de una base de datos, donde no se pueden garantizar que una columna no contenga nada más que valores nulos. Puede evitar esto encasillando sus campos en cadenas usando el mapeo, pero definitivamente sugiero que ElasticSearch pueda manejar el valor del script de manera más inteligente.

Comentario más útil

Esto debería funcionar:

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

O tal vez incluso esto:

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

Aun así, con suficiente conjunto de datos, donde al menos un documento tiene un valor de position en cada fragmento, no debería necesitar esta verificación, y luego el rendimiento de su secuencia de comandos será mucho mejor.

Todos 5 comentarios

¡Ah, y gracias por un producto increíble! :-)

hola,

Esto sucede porque ese campo aún no se ha introducido (tiene un valor nulo). Una vez que se introduce (con un solo valor, en el clúster), funcionará bien. También puede definir null-value en las asignaciones que indexarán un valor nulo específico cuando ese campo tenga null . Como no se introdujo, no se puede derivar su tipo.

Sí, lo entiendo. ¿No sería mejor que el valor del script devolviera un valor nulo o al menos tuviera algún tipo de función para verificar su existencia, en lugar de generar una excepción y hacer que no se devuelvan resultados?

P.ej:

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

Esto debería funcionar:

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

O tal vez incluso esto:

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

Aun así, con suficiente conjunto de datos, donde al menos un documento tiene un valor de position en cada fragmento, no debería necesitar esta verificación, y luego el rendimiento de su secuencia de comandos será mucho mejor.

Error fatal: No detectado [NoFieldFound]No se encontró ningún campo: Contact._PloiciesLastApplicationDate0 Intento: 1 vez(es). arrojado

Recibo el siguiente error al actualizar el contacto.

por ejemplo:-

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

Estoy obteniendo el contacto y actualizándolo según el número de teléfono, ¿pero da este error?

¡Gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones